diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index f2f4962..d330805 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -326,7 +326,7 @@
 
     private BubbleTextView mWaitingForResume;
 
-    protected TransparentBars mTransparentBars;
+    protected TranslucentDecor mTransparentDecor;
 
     private HideFromAccessibilityHelper mHideFromAccessibilityHelper
         = new HideFromAccessibilityHelper();
@@ -426,8 +426,8 @@
         checkForLocaleChange();
         setContentView(R.layout.launcher);
 
-        mTransparentBars = new TransparentBars(findViewById(R.id.launcher));
-        mTransparentBars.requestTransparentBars(true);
+        mTransparentDecor = new TranslucentDecor(findViewById(R.id.launcher));
+        mTransparentDecor.requestTranslucentDecor(true);
 
         setupViews();
         grid.layout(this);
diff --git a/src/com/android/launcher3/TranslucentDecor.java b/src/com/android/launcher3/TranslucentDecor.java
new file mode 100644
index 0000000..b50c022
--- /dev/null
+++ b/src/com/android/launcher3/TranslucentDecor.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.launcher3;
+
+import android.app.Activity;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+public class TranslucentDecor {
+    private static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000;
+    private static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000;
+
+    // Replace with SDK constants when available.
+    public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000;
+    public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;
+
+    // Behave properly on early K builds.
+    public static final boolean SYSUI_SUPPORTED = !hasSystemUiFlag("ALLOW_TRANSIENT") &&
+            hasSystemUiFlag("TRANSPARENT_STATUS") &&
+            hasSystemUiFlag("TRANSPARENT_NAVIGATION");
+
+    public static final boolean WM_SUPPORTED =
+            hasWindowManagerFlag("TRANSLUCENT_STATUS") &&
+            hasWindowManagerFlag("TRANSLUCENT_NAVIGATION");
+
+    private final View mTarget;
+
+    public TranslucentDecor(View target) {
+        mTarget = target;
+    }
+
+    public void requestTranslucentDecor(boolean translucent) {
+        int sysui = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+        if (WM_SUPPORTED && mTarget.getContext() instanceof Activity) {
+            Window w = ((Activity) mTarget.getContext()).getWindow();
+            int wmFlags = FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION;
+            if (translucent) {
+                w.addFlags(wmFlags);
+            } else {
+               w.clearFlags(wmFlags);
+            }
+        } else if (SYSUI_SUPPORTED) {  // Remove when droidfood platform is updated
+            if (translucent) {
+                sysui |= SYSTEM_UI_FLAG_TRANSPARENT_STATUS | SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
+            }
+        }
+        mTarget.setSystemUiVisibility(sysui);
+    }
+
+    private static boolean hasWindowManagerFlag(String name) {
+        try {
+            return WindowManager.LayoutParams.class.getField("FLAG_" + name) != null;
+        } catch (NoSuchFieldException e) {
+            return false;
+        }
+    }
+
+    private static boolean hasSystemUiFlag(String name) {
+        try {
+            return View.class.getField("SYSTEM_UI_FLAG_" + name) != null;
+        } catch (NoSuchFieldException e) {
+            return false;
+        }
+    }
+}
diff --git a/src/com/android/launcher3/TransparentBars.java b/src/com/android/launcher3/TransparentBars.java
deleted file mode 100644
index a12da9e..0000000
--- a/src/com/android/launcher3/TransparentBars.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.android.launcher3;
-
-import android.view.View;
-
-public class TransparentBars {
-    private static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000;
-    private static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000;
-
-    // Behave properly on early K builds.  Replace with api check once sdk is baked.
-    public static final boolean SUPPORTED = !hasSystemUiFlag("ALLOW_TRANSIENT")
-            && hasSystemUiFlag("TRANSPARENT_STATUS")
-            && hasSystemUiFlag("TRANSPARENT_NAVIGATION");
-
-    private final View mTarget;
-
-    public TransparentBars(View target) {
-        mTarget = target;
-    }
-
-    public void requestTransparentBars(boolean transparent) {
-        if (!SUPPORTED) return;
-        int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
-                  | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-                  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
-        if (transparent) {
-            flags |= SYSTEM_UI_FLAG_TRANSPARENT_STATUS | SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
-        }
-        mTarget.setSystemUiVisibility(flags);
-    }
-
-    private static boolean hasSystemUiFlag(String name) {
-        try {
-            return View.class.getField("SYSTEM_UI_FLAG_" + name) != null;
-        } catch (NoSuchFieldException e) {
-            return false;
-        }
-    }
-}
diff --git a/src/com/android/launcher3/WallpaperCropActivity.java b/src/com/android/launcher3/WallpaperCropActivity.java
index 703db9a..78c8964 100644
--- a/src/com/android/launcher3/WallpaperCropActivity.java
+++ b/src/com/android/launcher3/WallpaperCropActivity.java
@@ -102,8 +102,8 @@
                         cropImageAndSetWallpaper(imageUri, null, finishActivityWhenDone);
                     }
                 });
-        TransparentBars transparentBars = new TransparentBars(findViewById(R.id.wallpaper_root));
-        transparentBars.requestTransparentBars(true);
+        TranslucentDecor transparentDecor = new TranslucentDecor(findViewById(R.id.wallpaper_root));
+        transparentDecor.requestTranslucentDecor(true);
     }
 
     public boolean enableRotation() {
diff --git a/src/com/android/launcher3/WallpaperPickerActivity.java b/src/com/android/launcher3/WallpaperPickerActivity.java
index 9702a3a..82c9977 100644
--- a/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -181,8 +181,8 @@
     protected void init() {
         setContentView(R.layout.wallpaper_picker);
         final WallpaperRootView root = (WallpaperRootView) findViewById(R.id.wallpaper_root);
-        TransparentBars transparentBars = new TransparentBars(root);
-        transparentBars.requestTransparentBars(true);
+        TranslucentDecor transparentDecor = new TranslucentDecor(root);
+        transparentDecor.requestTranslucentDecor(true);
 
         mCropView = (CropView) findViewById(R.id.cropView);
         mWallpaperStrip = findViewById(R.id.wallpaper_strip);
