diff --git a/res/values/strings.xml b/res/values/strings.xml
index 59d782f..6e87646 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -18,8 +18,11 @@
     <!-- Title of the application. Used as a fallback for TalkBack when activity label is not specified (an accessibility service). [CHAR LIMIT=NONE] -->
     <string name="retail_demo_title">Retail demo</string>
 
+    <!-- File name of the demo video in the preloads/demo folder. [DO NOT TRANSLATE] -->
+    <string name="retail_demo_video_file_name">retail_demo.mp4</string>
+
     <!-- URL where the retail demo video can be downloaded from. [DO NOT TRANSLATE] -->
-    <string name="retail_demo_video_download_url" translatable="false"></string>
+    <string name="retail_demo_video_download_url"></string>
 
     <!-- The component name for the demo overlay app. [DO NOT TRANSLATE] -->
     <string name="demo_overlay_app_component" translatable="false"></string>
diff --git a/src/com/android/retaildemo/DemoPlayer.java b/src/com/android/retaildemo/DemoPlayer.java
index 3ebdfc8..320c17a 100644
--- a/src/com/android/retaildemo/DemoPlayer.java
+++ b/src/com/android/retaildemo/DemoPlayer.java
@@ -55,10 +55,6 @@
     private static final String TAG = "DemoPlayer";
     private static final boolean DEBUG = false;
 
-    private static final String VIDEO_FILE_NAME = "retail_demo.mp4";
-    static final String PRELOADED_VIDEO_FILE = Environment.getDataPreloadsDemoDirectory()
-            + File.separator + VIDEO_FILE_NAME;
-
     /**
      * We save the real elapsed time to serve as an indication for downloading the demo video
      * for the next device boot. The device could boot fast at times and could result in
@@ -81,6 +77,7 @@
     private Handler mHandler;
     private boolean mReadyToTap;
     private SettingsObserver mSettingsObserver;
+    private File mPreloadedVideoFile;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -94,7 +91,10 @@
 
         mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
         mHandler = new Handler();
-        mDownloadPath = getObbDir().getPath() + File.separator + VIDEO_FILE_NAME;
+        final String preloadedFileName = getString(R.string.retail_demo_video_file_name);
+        mPreloadedVideoFile = new File(Environment.getDataPreloadsDemoDirectory(),
+                preloadedFileName);
+        mDownloadPath = getObbDir().getPath() + File.separator + preloadedFileName;
         mVideoView = (VideoView) findViewById(R.id.video_content);
 
         // Start playing the video when it is ready
@@ -109,11 +109,11 @@
         mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
             @Override
             public boolean onError(MediaPlayer mp, int what, int extra) {
-                if (mUsingDownloadedVideo && new File(PRELOADED_VIDEO_FILE).exists()) {
+                if (mUsingDownloadedVideo && mPreloadedVideoFile.exists()) {
                     if (DEBUG) Log.d(TAG, "Error using the downloaded video, "
-                            + "falling back to the preloaded video at " + PRELOADED_VIDEO_FILE);
+                            + "falling back to the preloaded video at " + mPreloadedVideoFile);
                     mUsingDownloadedVideo = false;
-                    setVideoPath(PRELOADED_VIDEO_FILE);
+                    setVideoPath(mPreloadedVideoFile.getPath());
                     // And delete the downloaded video so that we don't try to use it
                     // again next time.
                     new File(mDownloadPath).delete();
@@ -159,9 +159,9 @@
             if (DEBUG) Log.d(TAG, "Using the already existing video at " + mDownloadPath);
             setVideoPath(mDownloadPath);
             isVideoSet = true;
-        } else if (new File(PRELOADED_VIDEO_FILE).exists()) {
-            if (DEBUG) Log.d(TAG, "Using the preloaded video at " + PRELOADED_VIDEO_FILE);
-            setVideoPath(PRELOADED_VIDEO_FILE);
+        } else if (mPreloadedVideoFile.exists()) {
+            if (DEBUG) Log.d(TAG, "Using the preloaded video at " + mPreloadedVideoFile);
+            setVideoPath(mPreloadedVideoFile.getPath());
             isVideoSet = true;
         }
 
@@ -181,7 +181,7 @@
             }
             return;
         }
-        new DownloadVideoTask(this, mDownloadPath, this).run();
+        new DownloadVideoTask(this, mDownloadPath, mPreloadedVideoFile, this).run();
     }
 
     private boolean checkIfDownloadingAllowed() {
diff --git a/src/com/android/retaildemo/DownloadVideoTask.java b/src/com/android/retaildemo/DownloadVideoTask.java
index fd211aa..7b664c7 100644
--- a/src/com/android/retaildemo/DownloadVideoTask.java
+++ b/src/com/android/retaildemo/DownloadVideoTask.java
@@ -67,12 +67,14 @@
     private long mVideoUpdateDownloadId;
     private String mDownloadedPath;
     private boolean mVideoAlreadySet;
+    private File mPreloadVideoFile;
 
-    public DownloadVideoTask(Context context, String downloadPath, ResultListener listener) {
+    public DownloadVideoTask(Context context, String downloadPath, File preloadVideoFile,
+            ResultListener listener) {
         mContext = context;
         mDownloadFile = new File(downloadPath);
         mListener = listener;
-
+        mPreloadVideoFile = preloadVideoFile;
         mDlm = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
         mDownloadUrl = mContext.getString(R.string.retail_demo_video_download_url);
     }
@@ -88,11 +90,11 @@
         mHandler = new ThreadHandler(thread.getLooper());
 
         mVideoAlreadySet =
-                mDownloadFile.exists() || new File(DemoPlayer.PRELOADED_VIDEO_FILE).exists();
+                mDownloadFile.exists() || mPreloadVideoFile.exists();
         // If file already exists, no need to download it again.
         if (mVideoAlreadySet) {
             if (DEBUG) Log.d(TAG, "Video already exists at either " + mDownloadFile.getPath()
-                    + " or " + DemoPlayer.PRELOADED_VIDEO_FILE + ", checking for an update... ");
+                    + " or " + mPreloadVideoFile + ", checking for an update... ");
             mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_FOR_UPDATE));
         } else {
             if (!isConnectedToNetwork()) {
