Clean Up and Add new Flags for SPE in ODP and FC

Bug: 338411035
Test: atest OnDevicePersonalizationManagingServicesTests:PhFlagsTest FederatedComputeServicesTests:PhFlagsTest
Change-Id: Ia89c049ad45f793183416f2eee9944d225c72df5
diff --git a/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java b/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java
index 9bea97b..6a7bf9d 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java
@@ -16,6 +16,8 @@
 
 package com.android.federatedcompute.services.common;
 
+import com.android.adservices.shared.common.flags.ConfigFlag;
+import com.android.adservices.shared.common.flags.FeatureFlag;
 import com.android.adservices.shared.common.flags.ModuleSharedFlags;
 
 import java.util.concurrent.TimeUnit;
@@ -209,19 +211,6 @@
         return DEFAULT_TASK_HISTORY_TTL_MILLIS;
     }
 
-    boolean DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED = false;
-
-    default boolean getBackgroundJobsLoggingEnabled() {
-        return DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED;
-    }
-
-    /** Default logging rate in percent */
-    int DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE = 5;
-
-    default int getBackgroundJobSamplingLoggingRate() {
-        return DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
-    }
-
     int DEFAULT_EXAMPLE_STORE_SERVICE_CALLBACK_TIMEOUT_SEC = 10;
 
     default int getExampleStoreServiceCallbackTimeoutSec() {
@@ -243,10 +232,22 @@
 
     long FCP_DEFAULT_MEMORY_SIZE_LIMIT = 50000000L; // 50 MBs in bytes
 
-    /**
-     * Provides upper limit for FCP temp files.
-     */
+    /** Provides upper limit for FCP temp files. */
     default long getFcpMemorySizeLimit() {
         return FCP_DEFAULT_MEMORY_SIZE_LIMIT;
     }
+
+    /** Default value for the base64 encoded Job Policy proto for FCP background jobs. */
+    @ConfigFlag String DEFAULT_FCP_MODULE_JOB_POLICY = "";
+
+    default String getFcpModuleJobPolicy() {
+        return DEFAULT_FCP_MODULE_JOB_POLICY;
+    }
+
+    /** Default value for SPE to be enabled for the pilot background jobs. */
+    @FeatureFlag boolean DEFAULT_SPE_PILOT_JOB_ENABLED = false;
+
+    default boolean getSpePilotJobEnabled() {
+        return DEFAULT_SPE_PILOT_JOB_ENABLED;
+    }
 }
diff --git a/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java b/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java
index 6dc6500..2b96196 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java
@@ -79,6 +79,12 @@
     static final String FCP_ENABLE_BACKGROUND_JOBS_LOGGING = "fcp_enable_background_jobs_logging";
     static final String FCP_BACKGROUND_JOB_LOGGING_SAMPLING_RATE =
             "fcp_background_job_logging_sampling_rate";
+    static final String FCP_JOB_SCHEDULING_LOGGING_ENABLED = "fcp_job_scheduling_logging_enabled";
+
+    static final String FCP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE =
+            "fcp_job_scheduling_logging_sampling_rate";
+    static final String FCP_MODULE_JOB_POLICY = "fcp_module_job_policy";
+    static final String FCP_SPE_PILOT_JOB_ENABLED = "fcp_spe_pilot_job_enabled";
     static final String EXAMPLE_STORE_SERVICE_CALLBACK_TIMEOUT_SEC =
             "example_store_service_timeout_sec";
     static final String FCP_TF_ERROR_RESCHEDULE_SECONDS_CONFIG_NAME = "tf_error_reschedule_seconds";
@@ -266,7 +272,7 @@
                             return DeviceConfig.getBoolean(
                                     /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
                                     /* name= */ FCP_ENABLE_BACKGROUND_JOBS_LOGGING,
-                                    /* defaultValue= */ DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED);
+                                    /* defaultValue= */ BACKGROUND_JOB_LOGGING_ENABLED);
                         });
     }
 
@@ -275,7 +281,39 @@
         return DeviceConfig.getInt(
                 /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 /* name= */ FCP_BACKGROUND_JOB_LOGGING_SAMPLING_RATE,
-                /* defaultValue= */ DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE);
+                /* defaultValue= */ BACKGROUND_JOB_SAMPLING_LOGGING_RATE);
+    }
+
+    @Override
+    public boolean getJobSchedulingLoggingEnabled() {
+        return DeviceConfig.getBoolean(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ FCP_JOB_SCHEDULING_LOGGING_ENABLED,
+                /* defaultValue= */ DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED);
+    }
+
+    @Override
+    public int getJobSchedulingLoggingSamplingRate() {
+        return DeviceConfig.getInt(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ FCP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
+                /* defaultValue= */ DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE);
+    }
+
+    @Override
+    public String getFcpModuleJobPolicy() {
+        return DeviceConfig.getString(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name */ FCP_MODULE_JOB_POLICY,
+                /* defaultValue */ DEFAULT_FCP_MODULE_JOB_POLICY);
+    }
+
+    @Override
+    public boolean getSpePilotJobEnabled() {
+        return DeviceConfig.getBoolean(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ FCP_SPE_PILOT_JOB_ENABLED,
+                /* defaultValue= */ DEFAULT_SPE_PILOT_JOB_ENABLED);
     }
 
     @Override
@@ -309,5 +347,4 @@
                 /* name= */ FCP_MEMORY_SIZE_LIMIT_CONFIG_NAME,
                 /* defaultValue= */ FCP_DEFAULT_MEMORY_SIZE_LIMIT);
     }
-
 }
diff --git a/src/com/android/ondevicepersonalization/services/Flags.java b/src/com/android/ondevicepersonalization/services/Flags.java
index 4e6e3be..ce9361c 100644
--- a/src/com/android/ondevicepersonalization/services/Flags.java
+++ b/src/com/android/ondevicepersonalization/services/Flags.java
@@ -16,6 +16,8 @@
 
 package com.android.ondevicepersonalization.services;
 
+import com.android.adservices.shared.common.flags.ConfigFlag;
+import com.android.adservices.shared.common.flags.FeatureFlag;
 import com.android.adservices.shared.common.flags.ModuleSharedFlags;
 
 /**
@@ -70,42 +72,29 @@
      */
     int WEB_TRIGGER_FLOW_DEADLINE_SECONDS = 30;
 
-
-    /**
-     * Default value for the list of trusted partner app names.
-     */
+    /** Default value for the list of trusted partner app names. */
     String DEFAULT_TRUSTED_PARTNER_APPS_LIST = "";
 
-    /**
-     * Default value for the shared isolated process feature.
-     */
+    /** Default value for the shared isolated process feature. */
     boolean DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED = true;
 
-    /**
-     * Default value for enabling client error logging.
-     */
+    /** Default value for enabling client error logging. */
     boolean DEFAULT_CLIENT_ERROR_LOGGING_ENABLED = false;
 
-    /**
-     * Default value for enabling background jobs logging.
-     */
-    boolean DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED = false;
+    /** Default value for the base64 encoded Job Policy proto for ODP background jobs. */
+    @ConfigFlag String DEFAULT_ODP_MODULE_JOB_POLICY = "";
 
-    /**
-     * Default value for background job sampling logging rate.
-     */
-    int DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE = 5;
+    /** Default value for SPE to be enabled for the pilot background jobs. */
+    @FeatureFlag boolean DEFAULT_SPE_PILOT_JOB_ENABLED = false;
 
-    /**
-     * Default value for isolated service debugging flag.
-     */
+    /** Default value for isolated service debugging flag. */
     boolean DEFAULT_ISOLATED_SERVICE_DEBUGGING_ENABLED = false;
 
     /** Default delay before starting a data reset. */
-    int DEFAULT_RESET_DATA_DELAY_SECONDS = 24 * 60 * 60;  // 24 hours
+    int DEFAULT_RESET_DATA_DELAY_SECONDS = 24 * 60 * 60; // 24 hours
 
     /** Default deadline for data reset. */
-    int DEFAULT_RESET_DATA_DEADLINE_SECONDS = 30 * 60 * 60;  // 30 hours
+    int DEFAULT_RESET_DATA_DEADLINE_SECONDS = 30 * 60 * 60; // 30 hours
 
     String DEFAULT_CALLER_APP_ALLOW_LIST =
             "android.ondevicepersonalization,"
@@ -243,6 +232,14 @@
         return DEFAULT_ISOLATED_SERVICE_DEBUGGING_ENABLED;
     }
 
+    default String getOdpModuleJobPolicy() {
+        return DEFAULT_ODP_MODULE_JOB_POLICY;
+    }
+
+    default boolean getSpePilotJobEnabled() {
+        return DEFAULT_SPE_PILOT_JOB_ENABLED;
+    }
+
     /** Set all stable flags. */
     default void setStableFlags() {}
 
diff --git a/src/com/android/ondevicepersonalization/services/PhFlags.java b/src/com/android/ondevicepersonalization/services/PhFlags.java
index 99a15c7..ffe5241 100644
--- a/src/com/android/ondevicepersonalization/services/PhFlags.java
+++ b/src/com/android/ondevicepersonalization/services/PhFlags.java
@@ -76,17 +76,25 @@
     public static final String KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE =
             "odp_background_job_sampling_logging_rate";
 
+    public static final String KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED =
+            "odp_job_scheduling_logging_enabled";
+
+    public static final String KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE =
+            "odp_job_scheduling_logging_sampling_rate";
+
+    public static final String KEY_ODP_MODULE_JOB_POLICY = "odp_module_job_policy";
+
+    public static final String KEY_ODP_SPE_PILOT_JOB_ENABLED = "odp_spe_pilot_job_enabled";
+
     public static final String KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED =
             "is_art_image_loading_optimization_enabled";
 
     public static final String KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED =
             "isolated_service_debugging_enabled";
 
-    public static final String KEY_RESET_DATA_DELAY_SECONDS =
-            "reset_data_delay_seconds";
+    public static final String KEY_RESET_DATA_DELAY_SECONDS = "reset_data_delay_seconds";
 
-    public static final String KEY_RESET_DATA_DEADLINE_SECONDS =
-            "reset_data_deadline_seconds";
+    public static final String KEY_RESET_DATA_DEADLINE_SECONDS = "reset_data_deadline_seconds";
 
     // OnDevicePersonalization Namespace String from DeviceConfig class
     public static final String NAMESPACE_ON_DEVICE_PERSONALIZATION = "on_device_personalization";
@@ -308,13 +316,15 @@
     @Override
     public boolean getBackgroundJobsLoggingEnabled() {
         // needs stable: execution stats may be less accurate if flag changed during job execution
-        return (boolean) mStableFlags.computeIfAbsent(KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED,
-                key -> {
-                    return DeviceConfig.getBoolean(
-                            /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
-                            /* name= */ KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED,
-                            /* defaultValue= */ DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED);
-                });
+        return (boolean)
+                mStableFlags.computeIfAbsent(
+                        KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED,
+                        key -> {
+                            return DeviceConfig.getBoolean(
+                                    /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                                    /* name= */ KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED,
+                                    /* defaultValue= */ BACKGROUND_JOB_LOGGING_ENABLED);
+                        });
     }
 
     @Override
@@ -322,7 +332,39 @@
         return DeviceConfig.getInt(
                 /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 /* name= */ KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE,
-                /* defaultValue= */ DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE);
+                /* defaultValue= */ BACKGROUND_JOB_SAMPLING_LOGGING_RATE);
+    }
+
+    @Override
+    public boolean getJobSchedulingLoggingEnabled() {
+        return DeviceConfig.getBoolean(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED,
+                /* defaultValue= */ DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED);
+    }
+
+    @Override
+    public int getJobSchedulingLoggingSamplingRate() {
+        return DeviceConfig.getInt(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
+                /* defaultValue= */ DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE);
+    }
+
+    @Override
+    public String getOdpModuleJobPolicy() {
+        return DeviceConfig.getString(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name */ KEY_ODP_MODULE_JOB_POLICY,
+                /* defaultValue */ DEFAULT_ODP_MODULE_JOB_POLICY);
+    }
+
+    @Override
+    public boolean getSpePilotJobEnabled() {
+        return DeviceConfig.getBoolean(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ KEY_ODP_SPE_PILOT_JOB_ENABLED,
+                /* defaultValue= */ DEFAULT_SPE_PILOT_JOB_ENABLED);
     }
 
     @Override
diff --git a/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java b/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java
index 05fe0da..0fbf437 100644
--- a/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java
+++ b/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java
@@ -16,10 +16,14 @@
 
 package com.android.federatedcompute.services.common;
 
-import static com.android.federatedcompute.services.common.Flags.DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED;
-import static com.android.federatedcompute.services.common.Flags.DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.BACKGROUND_JOB_LOGGING_ENABLED;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
 import static com.android.federatedcompute.services.common.Flags.DEFAULT_ENABLE_ELIGIBILITY_TASK;
+import static com.android.federatedcompute.services.common.Flags.DEFAULT_FCP_MODULE_JOB_POLICY;
 import static com.android.federatedcompute.services.common.Flags.DEFAULT_SCHEDULING_PERIOD_SECS;
+import static com.android.federatedcompute.services.common.Flags.DEFAULT_SPE_PILOT_JOB_ENABLED;
 import static com.android.federatedcompute.services.common.Flags.DEFAULT_THERMAL_STATUS_TO_THROTTLE;
 import static com.android.federatedcompute.services.common.Flags.DEFAULT_TRAINING_CONDITION_CHECK_THROTTLE_PERIOD_MILLIS;
 import static com.android.federatedcompute.services.common.Flags.DEFAULT_TRAINING_MIN_BATTERY_LEVEL;
@@ -42,8 +46,12 @@
 import static com.android.federatedcompute.services.common.PhFlags.FCP_ENABLE_BACKGROUND_JOBS_LOGGING;
 import static com.android.federatedcompute.services.common.PhFlags.FCP_ENABLE_CLIENT_ERROR_LOGGING;
 import static com.android.federatedcompute.services.common.PhFlags.FCP_ENABLE_ENCRYPTION;
+import static com.android.federatedcompute.services.common.PhFlags.FCP_JOB_SCHEDULING_LOGGING_ENABLED;
+import static com.android.federatedcompute.services.common.PhFlags.FCP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
 import static com.android.federatedcompute.services.common.PhFlags.FCP_MEMORY_SIZE_LIMIT_CONFIG_NAME;
+import static com.android.federatedcompute.services.common.PhFlags.FCP_MODULE_JOB_POLICY;
 import static com.android.federatedcompute.services.common.PhFlags.FCP_RESCHEDULE_LIMIT_CONFIG_NAME;
+import static com.android.federatedcompute.services.common.PhFlags.FCP_SPE_PILOT_JOB_ENABLED;
 import static com.android.federatedcompute.services.common.PhFlags.FEDERATED_COMPUTATION_ENCRYPTION_KEY_DOWNLOAD_URL;
 import static com.android.federatedcompute.services.common.PhFlags.HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME;
 import static com.android.federatedcompute.services.common.PhFlags.KEY_FEDERATED_COMPUTE_KILL_SWITCH;
@@ -152,12 +160,32 @@
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 FCP_ENABLE_BACKGROUND_JOBS_LOGGING,
-                Boolean.toString(DEFAULT_BACKGROUND_JOBS_LOGGING_ENABLED),
+                Boolean.toString(BACKGROUND_JOB_LOGGING_ENABLED),
                 /* makeDefault= */ false);
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 FCP_BACKGROUND_JOB_LOGGING_SAMPLING_RATE,
-                Integer.toString(DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE),
+                Integer.toString(BACKGROUND_JOB_SAMPLING_LOGGING_RATE),
+                /* makeDefault= */ false);
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_JOB_SCHEDULING_LOGGING_ENABLED,
+                Boolean.toString(DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED),
+                /* makeDefault= */ false);
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
+                Integer.toString(DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE),
+                /* makeDefault= */ false);
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_MODULE_JOB_POLICY,
+                DEFAULT_FCP_MODULE_JOB_POLICY,
+                /* makeDefault= */ false);
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_SPE_PILOT_JOB_ENABLED,
+                Boolean.toString(DEFAULT_SPE_PILOT_JOB_ENABLED),
                 /* makeDefault= */ false);
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
@@ -555,8 +583,9 @@
 
     @Test
     public void testGetBackgroundJobsLoggingEnabled() {
-        // read a stable flag value
+        // read a stable flag value and verify it's equal to the default value.
         boolean stableValue = FlagsFactory.getFlags().getBackgroundJobsLoggingEnabled();
+        assertThat(stableValue).isEqualTo(BACKGROUND_JOB_LOGGING_ENABLED);
 
         // Now overriding the value from PH.
         boolean overrideEnabled = !stableValue;
@@ -573,17 +602,12 @@
 
     @Test
     public void testGetBackgroundJobSamplingLoggingRate() {
-        int currentValue = 10;
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
-                FCP_BACKGROUND_JOB_LOGGING_SAMPLING_RATE,
-                Integer.toString(currentValue),
-                /* makeDefault= */ false);
+        int defaultValue = BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
         assertThat(FlagsFactory.getFlags().getBackgroundJobSamplingLoggingRate())
-                .isEqualTo(currentValue);
+                .isEqualTo(defaultValue);
 
         // Now overriding the value from PH.
-        int overrideRate = 1;
+        int overrideRate = defaultValue + 1;
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 FCP_BACKGROUND_JOB_LOGGING_SAMPLING_RATE,
@@ -615,4 +639,72 @@
         Flags phFlags = FlagsFactory.getFlags();
         assertThat(phFlags.getFcpMemorySizeLimit()).isEqualTo(overrideFcpMemLimit);
     }
+
+    @Test
+    public void testGetJobSchedulingLoggingEnabled() {
+        // read a stable flag value and verify it's equal to the default value.
+        boolean stableValue = FlagsFactory.getFlags().getJobSchedulingLoggingEnabled();
+        assertThat(stableValue).isEqualTo(DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED);
+
+        // override the value in device config.
+        boolean overrideEnabled = !stableValue;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_JOB_SCHEDULING_LOGGING_ENABLED,
+                Boolean.toString(overrideEnabled),
+                /* makeDefault= */ false);
+
+        // the flag value remains stable
+        assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingEnabled())
+                .isEqualTo(overrideEnabled);
+    }
+
+    @Test
+    public void testGetJobSchedulingLoggingSamplingRate() {
+        int defaultValue = DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
+        assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
+                .isEqualTo(defaultValue);
+
+        // Override the value in device config.
+        int overrideRate = defaultValue + 1;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
+                Integer.toString(overrideRate),
+                /* makeDefault= */ false);
+        assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
+                .isEqualTo(overrideRate);
+    }
+
+    @Test
+    public void testGetFcpModuleJobPolicy() {
+        assertThat(FlagsFactory.getFlags().getFcpModuleJobPolicy())
+                .isEqualTo(DEFAULT_FCP_MODULE_JOB_POLICY);
+
+        String overrideValue = "Something";
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_MODULE_JOB_POLICY,
+                overrideValue,
+                /* makeDefault= */ false);
+        assertThat(FlagsFactory.getFlags().getFcpModuleJobPolicy()).isEqualTo(overrideValue);
+    }
+
+    @Test
+    public void testGetSpePilotJobEnabled() {
+        // read a stable flag value and verify it's equal to the default value.
+        boolean stableValue = FlagsFactory.getFlags().getSpePilotJobEnabled();
+        assertThat(stableValue).isEqualTo(DEFAULT_SPE_PILOT_JOB_ENABLED);
+
+        // override the value in device config.
+        boolean overrideEnabled = !stableValue;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                FCP_SPE_PILOT_JOB_ENABLED,
+                Boolean.toString(overrideEnabled),
+                /* makeDefault= */ false);
+
+        // the flag value remains stable
+        assertThat(FlagsFactory.getFlags().getSpePilotJobEnabled()).isEqualTo(overrideEnabled);
+    }
 }
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java
index a2ba05e..1dedaf4 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java
@@ -16,12 +16,18 @@
 
 package com.android.ondevicepersonalization.services;
 
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.BACKGROUND_JOB_LOGGING_ENABLED;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED;
+import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
 import static com.android.ondevicepersonalization.services.Flags.APP_REQUEST_FLOW_DEADLINE_SECONDS;
 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_CALLER_APP_ALLOW_LIST;
 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_CLIENT_ERROR_LOGGING_ENABLED;
 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ISOLATED_SERVICE_ALLOW_LIST;
+import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_MODULE_JOB_POLICY;
 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_OUTPUT_DATA_ALLOW_LIST;
 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
+import static com.android.ondevicepersonalization.services.Flags.DEFAULT_SPE_PILOT_JOB_ENABLED;
 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_TRUSTED_PARTNER_APPS_LIST;
 import static com.android.ondevicepersonalization.services.Flags.DOWNLOAD_FLOW_DEADLINE_SECONDS;
 import static com.android.ondevicepersonalization.services.Flags.ENABLE_PERSONALIZATION_STATUS_OVERRIDE;
@@ -44,6 +50,10 @@
 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED;
 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING;
+import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED;
+import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
+import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_MODULE_JOB_POLICY;
+import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_SPE_PILOT_JOB_ENABLED;
 import static com.android.ondevicepersonalization.services.PhFlags.KEY_OUTPUT_DATA_ALLOW_LIST;
 import static com.android.ondevicepersonalization.services.PhFlags.KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE;
 import static com.android.ondevicepersonalization.services.PhFlags.KEY_RENDER_FLOW_DEADLINE_SECONDS;
@@ -56,18 +66,14 @@
 
 import android.provider.DeviceConfig;
 
-import androidx.test.runner.AndroidJUnit4;
-
 import com.android.modules.utils.build.SdkLevel;
 import com.android.modules.utils.testing.TestableDeviceConfig;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
-/** Unit tests for {@link com.android.ondevicepersonalization.service.PhFlags} */
-@RunWith(AndroidJUnit4.class)
+/** Unit tests for {@link com.android.ondevicepersonalization.services.PhFlags} */
 public class PhFlagsTest {
     @Rule
     public final TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule =
@@ -505,8 +511,9 @@
 
     @Test
     public void testGetBackgroundJobsLoggingEnabled() {
-        // read a stable flag value
+        // read a stable flag value and verify it's equal to the default value.
         boolean stableValue = FlagsFactory.getFlags().getBackgroundJobsLoggingEnabled();
+        assertThat(stableValue).isEqualTo(BACKGROUND_JOB_LOGGING_ENABLED);
 
         // override the value in device config.
         boolean overrideEnabled = !stableValue;
@@ -523,17 +530,12 @@
 
     @Test
     public void testGetBackgroundJobSamplingLoggingRate() {
-        int currentValue = 10;
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
-                KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE,
-                Integer.toString(currentValue),
-                /* makeDefault= */ false);
+        int defaultValue = BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
         assertThat(FlagsFactory.getFlags().getBackgroundJobSamplingLoggingRate())
-                .isEqualTo(currentValue);
+                .isEqualTo(defaultValue);
 
         // Override the value in device config.
-        int overrideRate = 1;
+        int overrideRate = defaultValue + 1;
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE,
@@ -542,4 +544,72 @@
         assertThat(FlagsFactory.getFlags().getBackgroundJobSamplingLoggingRate())
                 .isEqualTo(overrideRate);
     }
+
+    @Test
+    public void testGetJobSchedulingLoggingEnabled() {
+        // read a stable flag value and verify it's equal to the default value.
+        boolean stableValue = FlagsFactory.getFlags().getJobSchedulingLoggingEnabled();
+        assertThat(stableValue).isEqualTo(DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED);
+
+        // override the value in device config.
+        boolean overrideEnabled = !stableValue;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED,
+                Boolean.toString(overrideEnabled),
+                /* makeDefault= */ false);
+
+        // the flag value remains stable
+        assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingEnabled())
+                .isEqualTo(overrideEnabled);
+    }
+
+    @Test
+    public void testGetJobSchedulingLoggingSamplingRate() {
+        int defaultValue = DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
+        assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
+                .isEqualTo(defaultValue);
+
+        // Override the value in device config.
+        int overrideRate = defaultValue + 1;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
+                Integer.toString(overrideRate),
+                /* makeDefault= */ false);
+        assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
+                .isEqualTo(overrideRate);
+    }
+
+    @Test
+    public void testGetOdpModuleJobPolicy() {
+        assertThat(FlagsFactory.getFlags().getOdpModuleJobPolicy())
+                .isEqualTo(DEFAULT_ODP_MODULE_JOB_POLICY);
+
+        String overrideValue = "Something";
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                KEY_ODP_MODULE_JOB_POLICY,
+                overrideValue,
+                /* makeDefault= */ false);
+        assertThat(FlagsFactory.getFlags().getOdpModuleJobPolicy()).isEqualTo(overrideValue);
+    }
+
+    @Test
+    public void testGetSpePilotJobEnabled() {
+        // read a stable flag value and verify it's equal to the default value.
+        boolean stableValue = FlagsFactory.getFlags().getSpePilotJobEnabled();
+        assertThat(stableValue).isEqualTo(DEFAULT_SPE_PILOT_JOB_ENABLED);
+
+        // override the value in device config.
+        boolean overrideEnabled = !stableValue;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                KEY_ODP_SPE_PILOT_JOB_ENABLED,
+                Boolean.toString(overrideEnabled),
+                /* makeDefault= */ false);
+
+        // the flag value remains stable
+        assertThat(FlagsFactory.getFlags().getSpePilotJobEnabled()).isEqualTo(overrideEnabled);
+    }
 }