Add pref to control the new delay in TmaAssetProvider#openAssetFile

Bug: 140314643
Test: manual

Change-Id: I636e649435543adc073102de4eea130985eeca57
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java
index 15406a3..fc9fd49 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java
@@ -24,6 +24,8 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.car.media.testmediaapp.prefs.TmaPrefs;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
 
@@ -45,10 +47,17 @@
         return prefix + localArt;
     }
 
+    private int mAssetDelay = 0;
+
     @Override
     public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
         Log.i(TAG, "TmaAssetProvider#openAssetFile " + uri);
 
+        try {
+            Thread.sleep(mAssetDelay + (int)(mAssetDelay * (Math.random())));
+        } catch (InterruptedException ignored) {
+        }
+
         String file_path = uri.getPath();
         if (TextUtils.isEmpty(file_path)) throw new FileNotFoundException();
         try {
@@ -64,7 +73,9 @@
 
     @Override
     public boolean onCreate() {
-        return false;
+        TmaPrefs.getInstance(getContext()).mAssetReplyDelay.registerChangeListener(
+                (oldValue, newValue) -> mAssetDelay = newValue.mReplyDelayMs);
+        return true;
     }
 
     @Override
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java
index c795610..a51e623 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java
@@ -22,7 +22,6 @@
 import android.support.v4.media.MediaBrowserCompat.MediaItem;
 import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.media.session.PlaybackStateCompat;
-import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -30,7 +29,7 @@
 
 import com.android.car.media.testmediaapp.loader.TmaLoader;
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaAccountType;
-import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaNodeReplyDelay;
+import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaReplyDelay;
 import com.android.car.media.testmediaapp.prefs.TmaPrefs;
 
 import java.util.ArrayList;
@@ -139,7 +138,7 @@
     private void getMediaItemsWithDelay(@NonNull String parentId,
             @NonNull Result<List<MediaItem>> result, @Nullable String filter) {
         // TODO: allow per item override of the delay ?
-        TmaNodeReplyDelay delay = mPrefs.mRootReplyDelay.getValue();
+        TmaReplyDelay delay = mPrefs.mRootReplyDelay.getValue();
         Runnable task = () -> {
             TmaMediaItem node;
             if (TmaAccountType.NONE.equals(mPrefs.mAccountType.getValue())) {
@@ -164,7 +163,7 @@
                 result.sendResult(items);
             }
         };
-        if (delay == TmaNodeReplyDelay.NONE) {
+        if (delay == TmaReplyDelay.NONE) {
             task.run();
         } else {
             result.detach();
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaEnumPrefs.java b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaEnumPrefs.java
index cbbf92b..ad870b6 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaEnumPrefs.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaEnumPrefs.java
@@ -51,17 +51,19 @@
     }
 
     /** For simulating various reply speeds. */
-    public enum TmaNodeReplyDelay implements EnumPrefValue {
+    public enum TmaReplyDelay implements EnumPrefValue {
         NONE("None", "none", 0),
         SHORT("Short", "short", 50),
+        SHORT_PLUS("Short+", "short+", 150),
         MEDIUM("Medium", "medium", 500),
+        MEDIUM_PLUS("Medium+", "medium+", 2000),
         LONG("Long", "long", 5000),
         EXTRA_LONG("Extra-Long", "extra-long", 10000);
 
         private final PrefValueImpl mPrefValue;
         public final int mReplyDelayMs;
 
-        TmaNodeReplyDelay(String displayTitle, String id, int delayMs) {
+        TmaReplyDelay(String displayTitle, String id, int delayMs) {
             mPrefValue = new PrefValueImpl(displayTitle + "(" + delayMs + ")", id);
             mReplyDelayMs = delayMs;
         }
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java
index e3f9417..3305a06 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java
@@ -24,7 +24,7 @@
 
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaAccountType;
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaBrowseNodeType;
-import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaNodeReplyDelay;
+import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaReplyDelay;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -40,7 +40,10 @@
     public final PrefEntry<TmaBrowseNodeType> mRootNodeType;
 
     /** Wait time before sending a node reply, unless overridden in json (when supported). */
-    public final PrefEntry<TmaNodeReplyDelay> mRootReplyDelay;
+    public final PrefEntry<TmaReplyDelay> mRootReplyDelay;
+
+    /** Wait time for openAssetFile. */
+    public final PrefEntry<TmaReplyDelay> mAssetReplyDelay;
 
 
     public synchronized static TmaPrefs getInstance(Context context) {
@@ -58,7 +61,8 @@
     private enum TmaPrefKey {
         ACCOUNT_TYPE_KEY,
         ROOT_NODE_TYPE_KEY,
-        ROOT_REPLY_DELAY_KEY
+        ROOT_REPLY_DELAY_KEY,
+        ASSET_REPLY_DELAY_KEY
     }
 
     /**
@@ -120,7 +124,10 @@
                 TmaBrowseNodeType.values(), TmaBrowseNodeType.NULL);
 
         mRootReplyDelay = new EnumPrefEntry<>(TmaPrefKey.ROOT_REPLY_DELAY_KEY,
-                TmaNodeReplyDelay.values(), TmaNodeReplyDelay.NONE);
+                TmaReplyDelay.values(), TmaReplyDelay.NONE);
+
+        mAssetReplyDelay = new EnumPrefEntry<>(TmaPrefKey.ASSET_REPLY_DELAY_KEY,
+                TmaReplyDelay.values(), TmaReplyDelay.NONE);
     }
 
 
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefsFragment.java b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefsFragment.java
index 31cf4ae..482de16 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefsFragment.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefsFragment.java
@@ -26,7 +26,7 @@
 
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaAccountType;
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaBrowseNodeType;
-import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaNodeReplyDelay;
+import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaReplyDelay;
 import com.android.car.media.testmediaapp.prefs.TmaPrefs.PrefEntry;
 
 public class TmaPrefsFragment extends PreferenceFragmentCompat {
@@ -43,7 +43,9 @@
         screen.addPreference(createEnumPref(context, "Root node type", prefs.mRootNodeType,
                 TmaBrowseNodeType.values()));
         screen.addPreference(createEnumPref(context, "Root reply delay", prefs.mRootReplyDelay,
-                TmaNodeReplyDelay.values()));
+                TmaReplyDelay.values()));
+        screen.addPreference(createEnumPref(context, "Asset delay: random value in [v, 2v]",
+                prefs.mAssetReplyDelay, TmaReplyDelay.values()));
 
         setPreferenceScreen(screen);
     }