diff --git a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java
index bc602f3..c71bc31 100644
--- a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java
+++ b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java
@@ -23,71 +23,73 @@
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-
 import android.view.Gravity;
+
 import com.android.launcher3.R;
 
 /**
- * A helper class to positon and orient a drawable to be drawn.
- */
-class TransformedImageDrawable {
-    private Drawable mImage;
-    private float mXPercent;
-    private float mYPercent;
-    private int mGravity;
-    private int mAlpha;
-
-    /**
-     * @param gravity If one of the Gravity center values, the x and y offset will take the width
-     *                and height of the image into account to center the image to the offset.
-     */
-    public TransformedImageDrawable(Resources res, int resourceId, float xPct, float yPct,
-            int gravity) {
-        mImage = res.getDrawable(resourceId);
-        mXPercent = xPct;
-        mYPercent = yPct;
-        mGravity = gravity;
-    }
-
-    public void setAlpha(int alpha) {
-        mImage.setAlpha(alpha);
-        mAlpha = alpha;
-    }
-
-    public int getAlpha() {
-        return mAlpha;
-    }
-
-    public void updateBounds(Rect bounds) {
-        int width = mImage.getIntrinsicWidth();
-        int height = mImage.getIntrinsicHeight();
-        int left = bounds.left + (int) (mXPercent * bounds.width());
-        int top = bounds.top + (int) (mYPercent * bounds.height());
-        if ((mGravity & Gravity.CENTER_HORIZONTAL) == Gravity.CENTER_HORIZONTAL) {
-            left -= (width / 2);
-        }
-        if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) {
-            top -= (height / 2);
-        }
-        mImage.setBounds(left, top, left + width, top + height);
-    }
-
-    public void draw(Canvas canvas) {
-        int c = canvas.save(Canvas.MATRIX_SAVE_FLAG);
-        mImage.draw(canvas);
-        canvas.restoreToCount(c);
-    }
-}
-
-/**
  * This is a custom composite drawable that has a fixed virtual size and dynamically lays out its
  * children images relatively within its bounds.  This way, we can reduce the memory usage of a
  * single, large sparsely populated image.
  */
 public class AllAppsBackgroundDrawable extends Drawable {
 
-    private final TransformedImageDrawable mHand;
-    private final TransformedImageDrawable[] mIcons;
+    /**
+     * A helper class to positon and orient a drawable to be drawn.
+     */
+    protected static class TransformedImageDrawable {
+        private Drawable mImage;
+        private float mXPercent;
+        private float mYPercent;
+        private int mGravity;
+        private int mAlpha;
+
+        /**
+         * @param gravity If one of the Gravity center values, the x and y offset will take the width
+         *                and height of the image into account to center the image to the offset.
+         */
+        public TransformedImageDrawable(Resources res, int resourceId, float xPct, float yPct,
+                int gravity) {
+            mImage = res.getDrawable(resourceId);
+            mXPercent = xPct;
+            mYPercent = yPct;
+            mGravity = gravity;
+        }
+
+        public void setAlpha(int alpha) {
+            mImage.setAlpha(alpha);
+            mAlpha = alpha;
+        }
+
+        public int getAlpha() {
+            return mAlpha;
+        }
+
+        public void updateBounds(Rect bounds) {
+            int width = mImage.getIntrinsicWidth();
+            int height = mImage.getIntrinsicHeight();
+            int left = bounds.left + (int) (mXPercent * bounds.width());
+            int top = bounds.top + (int) (mYPercent * bounds.height());
+            if ((mGravity & Gravity.CENTER_HORIZONTAL) == Gravity.CENTER_HORIZONTAL) {
+                left -= (width / 2);
+            }
+            if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) {
+                top -= (height / 2);
+            }
+            mImage.setBounds(left, top, left + width, top + height);
+        }
+
+        public void draw(Canvas canvas) {
+            mImage.draw(canvas);
+        }
+
+        public Rect getBounds() {
+            return mImage.getBounds();
+        }
+    }
+
+    protected final TransformedImageDrawable mHand;
+    protected final TransformedImageDrawable[] mIcons;
     private final int mWidth;
     private final int mHeight;
 
diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
index 10d4c15..a41d832 100644
--- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
@@ -22,6 +22,7 @@
 import android.support.v7.widget.RecyclerView;
 import android.util.AttributeSet;
 import android.util.SparseIntArray;
+import android.view.MotionEvent;
 import android.view.View;
 
 import com.android.launcher3.BaseRecyclerView;
@@ -29,6 +30,7 @@
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.R;
+import com.android.launcher3.graphics.DrawableFactory;
 import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 
 import java.util.List;
@@ -207,7 +209,8 @@
 
         if (mApps.hasNoFilteredResults()) {
             if (mEmptySearchBackground == null) {
-                mEmptySearchBackground = new AllAppsBackgroundDrawable(getContext());
+                mEmptySearchBackground = DrawableFactory.get(getContext())
+                        .getAllAppsBackground(getContext());
                 mEmptySearchBackground.setAlpha(0);
                 mEmptySearchBackground.setCallback(this);
                 updateEmptySearchBackgroundBounds();
@@ -220,6 +223,16 @@
         }
     }
 
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent e) {
+        boolean result = super.onInterceptTouchEvent(e);
+        if (!result && e.getAction() == MotionEvent.ACTION_DOWN
+                && mEmptySearchBackground != null && mEmptySearchBackground.getAlpha() > 0) {
+            mEmptySearchBackground.setHotspot(e.getX(), e.getY());
+        }
+        return result;
+    }
+
     /**
      * Maps the touch (from 0..1) to the adapter position that should be visible.
      */
diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java
index f6a4b84..693df7a 100644
--- a/src/com/android/launcher3/graphics/DrawableFactory.java
+++ b/src/com/android/launcher3/graphics/DrawableFactory.java
@@ -23,6 +23,7 @@
 import com.android.launcher3.ItemInfo;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
+import com.android.launcher3.allapps.AllAppsBackgroundDrawable;
 
 /**
  * Factory for creating new drawables.
@@ -50,4 +51,8 @@
         d.setFilterBitmap(true);
         return d;
     }
+
+    public AllAppsBackgroundDrawable getAllAppsBackground(Context context) {
+        return new AllAppsBackgroundDrawable(context);
+    }
 }
