diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
index 5bec442..4b30a43 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
@@ -53,6 +53,12 @@
  * Policy that manages {@link DisplayArea}.
  */
 public abstract class DisplayAreaPolicy {
+    /**
+     * No corresponding use case yet (see b/154719717). The current implementation still uses
+     * {@link WindowState#shouldMagnify}.
+     */
+    static final boolean USE_DISPLAY_AREA_FOR_FULLSCREEN_MAGNIFICATION = false;
+
     protected final WindowManagerService mWmService;
 
     /**
@@ -161,14 +167,17 @@
                                         TYPE_STATUS_BAR, TYPE_NOTIFICATION_SHADE, TYPE_WALLPAPER)
                                 .build());
             }
+            if (USE_DISPLAY_AREA_FOR_FULLSCREEN_MAGNIFICATION) {
+                rootHierarchy.addFeature(
+                        new Feature.Builder(wmService.mPolicy, "FullscreenMagnification",
+                                FEATURE_FULLSCREEN_MAGNIFICATION)
+                                .all()
+                                .except(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, TYPE_INPUT_METHOD,
+                                        TYPE_INPUT_METHOD_DIALOG, TYPE_MAGNIFICATION_OVERLAY,
+                                        TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL)
+                                .build());
+            }
             rootHierarchy
-                    .addFeature(new Feature.Builder(wmService.mPolicy, "FullscreenMagnification",
-                            FEATURE_FULLSCREEN_MAGNIFICATION)
-                            .all()
-                            .except(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, TYPE_INPUT_METHOD,
-                                    TYPE_INPUT_METHOD_DIALOG, TYPE_MAGNIFICATION_OVERLAY,
-                                    TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL)
-                            .build())
                     .addFeature(new Feature.Builder(wmService.mPolicy, "ImePlaceholder",
                             FEATURE_IME_PLACEHOLDER)
                             .and(TYPE_INPUT_METHOD, TYPE_INPUT_METHOD_DIALOG)
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
index 22e411e..3f3b24a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
@@ -202,7 +202,7 @@
     }
 
     @Test
-    public void testBuilder_defaultPolicy_hasWindowedMagnificationFeature() {
+    public void testBuilder_defaultPolicy_hasMagnificationFeature() {
         final DisplayAreaPolicy.Provider defaultProvider = DisplayAreaPolicy.Provider.fromResources(
                 resourcesWithProvider(""));
         final DisplayAreaPolicyBuilder.Result defaultPolicy =
@@ -210,28 +210,16 @@
                         mRoot, mImeContainer);
         final List<Feature> features = defaultPolicy.getFeatures();
         boolean hasWindowedMagnificationFeature = false;
-        for (Feature feature : features) {
-            hasWindowedMagnificationFeature |= feature.getId() == FEATURE_WINDOWED_MAGNIFICATION;
-        }
-
-        assertThat(hasWindowedMagnificationFeature).isTrue();
-    }
-
-    @Test
-    public void testBuilder_defaultPolicy_hasFullscreenMagnificationFeature() {
-        final DisplayAreaPolicy.Provider defaultProvider = DisplayAreaPolicy.Provider.fromResources(
-                resourcesWithProvider(""));
-        final DisplayAreaPolicyBuilder.Result defaultPolicy =
-                (DisplayAreaPolicyBuilder.Result) defaultProvider.instantiate(mWms, mDisplayContent,
-                        mRoot, mImeContainer);
-        final List<Feature> features = defaultPolicy.getFeatures();
         boolean hasFullscreenMagnificationFeature = false;
         for (Feature feature : features) {
+            hasWindowedMagnificationFeature |= feature.getId() == FEATURE_WINDOWED_MAGNIFICATION;
             hasFullscreenMagnificationFeature |=
                     feature.getId() == FEATURE_FULLSCREEN_MAGNIFICATION;
         }
 
-        assertThat(hasFullscreenMagnificationFeature).isTrue();
+        assertThat(hasWindowedMagnificationFeature).isTrue();
+        assertThat(hasFullscreenMagnificationFeature).isEqualTo(
+                DisplayAreaPolicy.USE_DISPLAY_AREA_FOR_FULLSCREEN_MAGNIFICATION);
     }
 
     @Test
