diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-09 20:52:26 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-06-09 20:52:26 +0000 |
commit | afe26c1274d45c9af73d6a965b28100d9593e3ca (patch) | |
tree | 4b097070a4f7f3eafb2b260435589dfb00a052e1 | |
parent | ab49282dabd2c2866a005ff379f0beb4ac2d4c97 (diff) | |
parent | b6d7bf64a31bd4dfb23e4ab08000722cf7d2fcfc (diff) | |
download | tests-android11-gsi.tar.gz |
Snap for 7316203 from 33e2df4fc15c6fa805f7b754213068a3d899b593 to rvc-platform-release am: b6d7bf64a3android11-gsi
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Car/tests/+/14427430
Change-Id: If645b08084f539fe05885367df1968333d774def
11 files changed, 1845 insertions, 35 deletions
diff --git a/RotaryPlayground/AndroidManifest.xml b/RotaryPlayground/AndroidManifest.xml index 4aac33f..be6d847 100644 --- a/RotaryPlayground/AndroidManifest.xml +++ b/RotaryPlayground/AndroidManifest.xml @@ -23,11 +23,21 @@ <activity android:name=".RotaryActivity" android:label="@string/app_name" - android:allowEmbedded="true"> + android:allowEmbedded="true" + android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> + <!-- Define app-specific custom off-screen nudge up action: + GLOBAL_ACTION_NOTIFICATIONS --> + <meta-data android:name="nudge.up.globalAction" android:value="4"/> + <!-- Define app-specific custom off-screen nudge left action: KEYCODE_BACK --> + <meta-data android:name="nudge.left.keyCode" android:value="4"/> + <!-- Define app-specific custom off-screen nudge down action: launch Settings --> + <meta-data + android:name="nudge.down.intent" + android:value="intent:#Intent;action=android.settings.SETTINGS;category=android.intent.category.DEFAULT;end"/> </activity> </application> </manifest>
\ No newline at end of file diff --git a/RotaryPlayground/res/layout/custom_focus_areas_fragment.xml b/RotaryPlayground/res/layout/custom_focus_areas_fragment.xml index ea6a0b0..2750aab 100644 --- a/RotaryPlayground/res/layout/custom_focus_areas_fragment.xml +++ b/RotaryPlayground/res/layout/custom_focus_areas_fragment.xml @@ -34,7 +34,12 @@ android:layout_margin="@dimen/margin" android:gravity="center" android:orientation="vertical" - android:background="@color/card_background_color"> + android:background="@color/card_background_color" + app:wrapAround="true"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Wrap-around enabled"/> <Button android:layout_width="wrap_content" android:layout_height="@dimen/button_height" @@ -47,7 +52,6 @@ android:focusedByDefault="true" android:text="android:focusedByDefault"/> <Button - android:id="@+id/default_focus1" android:layout_width="wrap_content" android:layout_height="@dimen/button_height" android:paddingHorizontal="@dimen/padding" diff --git a/TestMediaApp/assets/media_items/GenerateSongsJson.java b/TestMediaApp/assets/media_items/GenerateSongsJson.java new file mode 100644 index 0000000..187af60 --- /dev/null +++ b/TestMediaApp/assets/media_items/GenerateSongsJson.java @@ -0,0 +1,68 @@ +import java.io.IOException; +import java.util.Random; +import java.io.FileOutputStream; + +/* + * This class will generate a json file containing 200 songs by default. + * Defaults: + * 1.) No. of songs - 200 + * 2.) Seed - 200 + * 3.) File name - "hundres_songs.json" + * + * If you want to change any of the default values pass them as arguments in the following: + * arg #1 No. of songs (Integer) + * arg #2 Seed (Integer) + * arg #3 File name (String) e.g <some-name>.json + */ + +public class GenerateSongsJson { + + private static final StringBuilder sb = new StringBuilder(); + + public static void main(String []args) throws IOException { + int numOfSongs = 200; + int seed = 200; + String fileName = "hundres_songs.json"; + + if (args.length != 0) { + try { + numOfSongs = Integer.parseInt(args[0]); + seed = Integer.parseInt(args[1]); + fileName = args[2]; + } catch (NumberFormatException e) { + System.out.println("Please enter the args as mentioned in the comment above."); + throw (e); + } + } + + Random randomNum = new Random(seed); + FileOutputStream outputStream = new FileOutputStream(fileName); + + sb.append("{ \n"); + sb.append(" \"FLAGS\": \"browsable\", \n\n"); + sb.append(" \"METADATA\": { \n"); + sb.append(" \"MEDIA_ID\": \"hundreds_songs\", \n"); + sb.append(" \"DISPLAY_TITLE\": \"More songs\" \n"); + sb.append(" },\n\n"); + sb.append(" \"CHILDREN\": [ \n"); + + for (int i = 1; i <= numOfSongs; i++) { + int num1 = randomNum.nextInt(10000); + int num2 = num1/1000; + sb.append(" { \n "); + sb.append(" \"FLAGS\": \"playable\",\n"); + sb.append(" \"METADATA\": { \n"); + sb.append(" \"MEDIA_ID\": \"hundreds_songs normal " + num2 + "s song" + i +"\",\n"); + sb.append(" \"DISPLAY_TITLE\": \"Normal " + num2 + "s song" + i + "\",\n"); + sb.append(" \"DURATION\": " + num1 + "\n"); + sb.append(" } \n"); + sb.append(" },\n"); + } + sb.deleteCharAt(sb.length() - 2); + sb.append(" ]\n"); + sb.append("}"); + byte[] strToBytes = sb.toString().getBytes(); + outputStream.write(strToBytes); + outputStream.close(); + } +} diff --git a/TestMediaApp/assets/media_items/advanced.json b/TestMediaApp/assets/media_items/advanced.json index 9266a1c..e12a92c 100644 --- a/TestMediaApp/assets/media_items/advanced.json +++ b/TestMediaApp/assets/media_items/advanced.json @@ -39,6 +39,15 @@ }, { "FLAGS": "browsable", + "PLAYABLE_HINT": "LIST", + "METADATA": { + "MEDIA_ID": "advanced toggles", + "DISPLAY_TITLE": "Node toggles (hide/show specific nodes)" + }, + "INCLUDE":"media_items/toggles.json" + }, + { + "FLAGS": "browsable", "BROWSABLE_HINT": "GRID_CATEGORY", "METADATA": { "MEDIA_ID": "advanced art nodes", @@ -50,6 +59,15 @@ "FLAGS": "browsable", "PLAYABLE_HINT": "LIST", "METADATA": { + "MEDIA_ID": "advanced more songs", + "DISPLAY_TITLE": "More songs" + }, + "INCLUDE":"media_items/hundreds_songs.json" + }, + { + "FLAGS": "browsable", + "PLAYABLE_HINT": "LIST", + "METADATA": { "MEDIA_ID": "advanced exceptions", "DISPLAY_TITLE": "Exceptions" }, diff --git a/TestMediaApp/assets/media_items/hundreds_songs.json b/TestMediaApp/assets/media_items/hundreds_songs.json new file mode 100644 index 0000000..2db0ffd --- /dev/null +++ b/TestMediaApp/assets/media_items/hundreds_songs.json @@ -0,0 +1,1611 @@ +{ + "FLAGS": "browsable", + + "METADATA": { + "MEDIA_ID": "hundreds_songs", + "DISPLAY_TITLE": "More songs" + }, + + "CHILDREN": [ + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song1", + "DISPLAY_TITLE": "Normal 4s song1", + "DURATION": 4329 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song2", + "DISPLAY_TITLE": "Normal 2s song2", + "DURATION": 2541 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song3", + "DISPLAY_TITLE": "Normal 0s song3", + "DURATION": 666 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song4", + "DISPLAY_TITLE": "Normal 9s song4", + "DURATION": 9833 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song5", + "DISPLAY_TITLE": "Normal 4s song5", + "DURATION": 4572 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song6", + "DISPLAY_TITLE": "Normal 0s song6", + "DURATION": 667 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song7", + "DISPLAY_TITLE": "Normal 3s song7", + "DURATION": 3914 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song8", + "DISPLAY_TITLE": "Normal 9s song8", + "DURATION": 9519 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song9", + "DISPLAY_TITLE": "Normal 4s song9", + "DURATION": 4778 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song10", + "DISPLAY_TITLE": "Normal 0s song10", + "DURATION": 242 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song11", + "DISPLAY_TITLE": "Normal 7s song11", + "DURATION": 7883 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song12", + "DISPLAY_TITLE": "Normal 9s song12", + "DURATION": 9884 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song13", + "DISPLAY_TITLE": "Normal 8s song13", + "DURATION": 8612 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song14", + "DISPLAY_TITLE": "Normal 7s song14", + "DURATION": 7395 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song15", + "DISPLAY_TITLE": "Normal 0s song15", + "DURATION": 19 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song16", + "DISPLAY_TITLE": "Normal 7s song16", + "DURATION": 7452 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song17", + "DISPLAY_TITLE": "Normal 2s song17", + "DURATION": 2562 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song18", + "DISPLAY_TITLE": "Normal 0s song18", + "DURATION": 644 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song19", + "DISPLAY_TITLE": "Normal 7s song19", + "DURATION": 7695 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song20", + "DISPLAY_TITLE": "Normal 0s song20", + "DURATION": 328 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song21", + "DISPLAY_TITLE": "Normal 5s song21", + "DURATION": 5640 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song22", + "DISPLAY_TITLE": "Normal 4s song22", + "DURATION": 4044 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song23", + "DISPLAY_TITLE": "Normal 3s song23", + "DURATION": 3905 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song24", + "DISPLAY_TITLE": "Normal 7s song24", + "DURATION": 7649 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song25", + "DISPLAY_TITLE": "Normal 8s song25", + "DURATION": 8259 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song26", + "DISPLAY_TITLE": "Normal 2s song26", + "DURATION": 2811 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song27", + "DISPLAY_TITLE": "Normal 5s song27", + "DURATION": 5156 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song28", + "DISPLAY_TITLE": "Normal 9s song28", + "DURATION": 9437 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song29", + "DISPLAY_TITLE": "Normal 3s song29", + "DURATION": 3395 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song30", + "DISPLAY_TITLE": "Normal 9s song30", + "DURATION": 9268 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song31", + "DISPLAY_TITLE": "Normal 5s song31", + "DURATION": 5904 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song32", + "DISPLAY_TITLE": "Normal 2s song32", + "DURATION": 2763 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song33", + "DISPLAY_TITLE": "Normal 6s song33", + "DURATION": 6387 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song34", + "DISPLAY_TITLE": "Normal 1s song34", + "DURATION": 1960 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song35", + "DISPLAY_TITLE": "Normal 0s song35", + "DURATION": 89 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song36", + "DISPLAY_TITLE": "Normal 1s song36", + "DURATION": 1156 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song37", + "DISPLAY_TITLE": "Normal 5s song37", + "DURATION": 5235 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song38", + "DISPLAY_TITLE": "Normal 3s song38", + "DURATION": 3983 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song39", + "DISPLAY_TITLE": "Normal 8s song39", + "DURATION": 8914 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song40", + "DISPLAY_TITLE": "Normal 9s song40", + "DURATION": 9568 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song41", + "DISPLAY_TITLE": "Normal 5s song41", + "DURATION": 5463 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song42", + "DISPLAY_TITLE": "Normal 1s song42", + "DURATION": 1301 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song43", + "DISPLAY_TITLE": "Normal 0s song43", + "DURATION": 575 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song44", + "DISPLAY_TITLE": "Normal 6s song44", + "DURATION": 6578 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song45", + "DISPLAY_TITLE": "Normal 2s song45", + "DURATION": 2312 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song46", + "DISPLAY_TITLE": "Normal 8s song46", + "DURATION": 8032 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song47", + "DISPLAY_TITLE": "Normal 8s song47", + "DURATION": 8120 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song48", + "DISPLAY_TITLE": "Normal 5s song48", + "DURATION": 5314 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song49", + "DISPLAY_TITLE": "Normal 3s song49", + "DURATION": 3784 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song50", + "DISPLAY_TITLE": "Normal 7s song50", + "DURATION": 7785 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song51", + "DISPLAY_TITLE": "Normal 5s song51", + "DURATION": 5641 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song52", + "DISPLAY_TITLE": "Normal 0s song52", + "DURATION": 165 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song53", + "DISPLAY_TITLE": "Normal 2s song53", + "DURATION": 2963 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song54", + "DISPLAY_TITLE": "Normal 7s song54", + "DURATION": 7742 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song55", + "DISPLAY_TITLE": "Normal 5s song55", + "DURATION": 5782 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song56", + "DISPLAY_TITLE": "Normal 6s song56", + "DURATION": 6154 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song57", + "DISPLAY_TITLE": "Normal 8s song57", + "DURATION": 8849 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song58", + "DISPLAY_TITLE": "Normal 8s song58", + "DURATION": 8099 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song59", + "DISPLAY_TITLE": "Normal 2s song59", + "DURATION": 2476 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song60", + "DISPLAY_TITLE": "Normal 6s song60", + "DURATION": 6323 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song61", + "DISPLAY_TITLE": "Normal 1s song61", + "DURATION": 1511 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song62", + "DISPLAY_TITLE": "Normal 8s song62", + "DURATION": 8577 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song63", + "DISPLAY_TITLE": "Normal 9s song63", + "DURATION": 9315 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song64", + "DISPLAY_TITLE": "Normal 4s song64", + "DURATION": 4846 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song65", + "DISPLAY_TITLE": "Normal 8s song65", + "DURATION": 8893 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song66", + "DISPLAY_TITLE": "Normal 7s song66", + "DURATION": 7404 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song67", + "DISPLAY_TITLE": "Normal 7s song67", + "DURATION": 7535 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song68", + "DISPLAY_TITLE": "Normal 0s song68", + "DURATION": 687 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song69", + "DISPLAY_TITLE": "Normal 7s song69", + "DURATION": 7563 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song70", + "DISPLAY_TITLE": "Normal 7s song70", + "DURATION": 7956 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song71", + "DISPLAY_TITLE": "Normal 3s song71", + "DURATION": 3030 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song72", + "DISPLAY_TITLE": "Normal 8s song72", + "DURATION": 8573 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song73", + "DISPLAY_TITLE": "Normal 2s song73", + "DURATION": 2621 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song74", + "DISPLAY_TITLE": "Normal 1s song74", + "DURATION": 1416 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song75", + "DISPLAY_TITLE": "Normal 8s song75", + "DURATION": 8252 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song76", + "DISPLAY_TITLE": "Normal 4s song76", + "DURATION": 4182 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song77", + "DISPLAY_TITLE": "Normal 9s song77", + "DURATION": 9158 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song78", + "DISPLAY_TITLE": "Normal 4s song78", + "DURATION": 4209 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song79", + "DISPLAY_TITLE": "Normal 2s song79", + "DURATION": 2265 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song80", + "DISPLAY_TITLE": "Normal 9s song80", + "DURATION": 9487 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song81", + "DISPLAY_TITLE": "Normal 8s song81", + "DURATION": 8640 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song82", + "DISPLAY_TITLE": "Normal 3s song82", + "DURATION": 3683 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song83", + "DISPLAY_TITLE": "Normal 8s song83", + "DURATION": 8813 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song84", + "DISPLAY_TITLE": "Normal 7s song84", + "DURATION": 7851 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song85", + "DISPLAY_TITLE": "Normal 4s song85", + "DURATION": 4161 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song86", + "DISPLAY_TITLE": "Normal 2s song86", + "DURATION": 2731 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song87", + "DISPLAY_TITLE": "Normal 9s song87", + "DURATION": 9546 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song88", + "DISPLAY_TITLE": "Normal 3s song88", + "DURATION": 3591 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song89", + "DISPLAY_TITLE": "Normal 7s song89", + "DURATION": 7513 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song90", + "DISPLAY_TITLE": "Normal 2s song90", + "DURATION": 2100 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song91", + "DISPLAY_TITLE": "Normal 9s song91", + "DURATION": 9359 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song92", + "DISPLAY_TITLE": "Normal 1s song92", + "DURATION": 1024 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song93", + "DISPLAY_TITLE": "Normal 1s song93", + "DURATION": 1640 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song94", + "DISPLAY_TITLE": "Normal 2s song94", + "DURATION": 2301 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song95", + "DISPLAY_TITLE": "Normal 2s song95", + "DURATION": 2965 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song96", + "DISPLAY_TITLE": "Normal 6s song96", + "DURATION": 6322 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song97", + "DISPLAY_TITLE": "Normal 7s song97", + "DURATION": 7693 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song98", + "DISPLAY_TITLE": "Normal 5s song98", + "DURATION": 5999 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song99", + "DISPLAY_TITLE": "Normal 2s song99", + "DURATION": 2305 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song100", + "DISPLAY_TITLE": "Normal 5s song100", + "DURATION": 5215 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song101", + "DISPLAY_TITLE": "Normal 5s song101", + "DURATION": 5672 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song102", + "DISPLAY_TITLE": "Normal 3s song102", + "DURATION": 3869 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song103", + "DISPLAY_TITLE": "Normal 7s song103", + "DURATION": 7274 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song104", + "DISPLAY_TITLE": "Normal 7s song104", + "DURATION": 7512 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song105", + "DISPLAY_TITLE": "Normal 9s song105", + "DURATION": 9697 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song106", + "DISPLAY_TITLE": "Normal 9s song106", + "DURATION": 9357 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song107", + "DISPLAY_TITLE": "Normal 9s song107", + "DURATION": 9589 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song108", + "DISPLAY_TITLE": "Normal 0s song108", + "DURATION": 794 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song109", + "DISPLAY_TITLE": "Normal 3s song109", + "DURATION": 3522 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song110", + "DISPLAY_TITLE": "Normal 5s song110", + "DURATION": 5709 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song111", + "DISPLAY_TITLE": "Normal 9s song111", + "DURATION": 9644 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song112", + "DISPLAY_TITLE": "Normal 2s song112", + "DURATION": 2936 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song113", + "DISPLAY_TITLE": "Normal 2s song113", + "DURATION": 2703 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song114", + "DISPLAY_TITLE": "Normal 3s song114", + "DURATION": 3539 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song115", + "DISPLAY_TITLE": "Normal 1s song115", + "DURATION": 1182 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song116", + "DISPLAY_TITLE": "Normal 3s song116", + "DURATION": 3520 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song117", + "DISPLAY_TITLE": "Normal 6s song117", + "DURATION": 6598 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song118", + "DISPLAY_TITLE": "Normal 3s song118", + "DURATION": 3014 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song119", + "DISPLAY_TITLE": "Normal 4s song119", + "DURATION": 4976 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song120", + "DISPLAY_TITLE": "Normal 1s song120", + "DURATION": 1101 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song121", + "DISPLAY_TITLE": "Normal 2s song121", + "DURATION": 2545 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song122", + "DISPLAY_TITLE": "Normal 4s song122", + "DURATION": 4163 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song123", + "DISPLAY_TITLE": "Normal 9s song123", + "DURATION": 9648 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song124", + "DISPLAY_TITLE": "Normal 1s song124", + "DURATION": 1065 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song125", + "DISPLAY_TITLE": "Normal 0s song125", + "DURATION": 969 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song126", + "DISPLAY_TITLE": "Normal 4s song126", + "DURATION": 4604 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song127", + "DISPLAY_TITLE": "Normal 5s song127", + "DURATION": 5114 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song128", + "DISPLAY_TITLE": "Normal 4s song128", + "DURATION": 4957 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song129", + "DISPLAY_TITLE": "Normal 4s song129", + "DURATION": 4596 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song130", + "DISPLAY_TITLE": "Normal 2s song130", + "DURATION": 2915 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song131", + "DISPLAY_TITLE": "Normal 8s song131", + "DURATION": 8467 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song132", + "DISPLAY_TITLE": "Normal 2s song132", + "DURATION": 2614 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song133", + "DISPLAY_TITLE": "Normal 4s song133", + "DURATION": 4943 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song134", + "DISPLAY_TITLE": "Normal 8s song134", + "DURATION": 8175 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song135", + "DISPLAY_TITLE": "Normal 2s song135", + "DURATION": 2499 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song136", + "DISPLAY_TITLE": "Normal 1s song136", + "DURATION": 1493 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song137", + "DISPLAY_TITLE": "Normal 9s song137", + "DURATION": 9239 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song138", + "DISPLAY_TITLE": "Normal 6s song138", + "DURATION": 6921 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song139", + "DISPLAY_TITLE": "Normal 8s song139", + "DURATION": 8720 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song140", + "DISPLAY_TITLE": "Normal 9s song140", + "DURATION": 9252 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song141", + "DISPLAY_TITLE": "Normal 9s song141", + "DURATION": 9328 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song142", + "DISPLAY_TITLE": "Normal 6s song142", + "DURATION": 6678 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song143", + "DISPLAY_TITLE": "Normal 0s song143", + "DURATION": 437 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song144", + "DISPLAY_TITLE": "Normal 7s song144", + "DURATION": 7488 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song145", + "DISPLAY_TITLE": "Normal 6s song145", + "DURATION": 6697 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song146", + "DISPLAY_TITLE": "Normal 9s song146", + "DURATION": 9552 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song147", + "DISPLAY_TITLE": "Normal 4s song147", + "DURATION": 4385 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song148", + "DISPLAY_TITLE": "Normal 3s song148", + "DURATION": 3911 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song149", + "DISPLAY_TITLE": "Normal 1s song149", + "DURATION": 1623 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song150", + "DISPLAY_TITLE": "Normal 6s song150", + "DURATION": 6163 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song151", + "DISPLAY_TITLE": "Normal 0s song151", + "DURATION": 556 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song152", + "DISPLAY_TITLE": "Normal 9s song152", + "DURATION": 9855 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song153", + "DISPLAY_TITLE": "Normal 7s song153", + "DURATION": 7837 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song154", + "DISPLAY_TITLE": "Normal 4s song154", + "DURATION": 4177 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song155", + "DISPLAY_TITLE": "Normal 6s song155", + "DURATION": 6693 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song156", + "DISPLAY_TITLE": "Normal 0s song156", + "DURATION": 193 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song157", + "DISPLAY_TITLE": "Normal 9s song157", + "DURATION": 9005 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song158", + "DISPLAY_TITLE": "Normal 1s song158", + "DURATION": 1923 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 0s song159", + "DISPLAY_TITLE": "Normal 0s song159", + "DURATION": 102 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song160", + "DISPLAY_TITLE": "Normal 3s song160", + "DURATION": 3632 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song161", + "DISPLAY_TITLE": "Normal 1s song161", + "DURATION": 1305 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song162", + "DISPLAY_TITLE": "Normal 5s song162", + "DURATION": 5805 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song163", + "DISPLAY_TITLE": "Normal 9s song163", + "DURATION": 9961 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song164", + "DISPLAY_TITLE": "Normal 6s song164", + "DURATION": 6154 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song165", + "DISPLAY_TITLE": "Normal 3s song165", + "DURATION": 3730 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song166", + "DISPLAY_TITLE": "Normal 9s song166", + "DURATION": 9677 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song167", + "DISPLAY_TITLE": "Normal 9s song167", + "DURATION": 9972 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song168", + "DISPLAY_TITLE": "Normal 6s song168", + "DURATION": 6138 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song169", + "DISPLAY_TITLE": "Normal 9s song169", + "DURATION": 9330 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song170", + "DISPLAY_TITLE": "Normal 9s song170", + "DURATION": 9360 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song171", + "DISPLAY_TITLE": "Normal 1s song171", + "DURATION": 1439 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song172", + "DISPLAY_TITLE": "Normal 5s song172", + "DURATION": 5831 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song173", + "DISPLAY_TITLE": "Normal 1s song173", + "DURATION": 1572 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song174", + "DISPLAY_TITLE": "Normal 8s song174", + "DURATION": 8160 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 1s song175", + "DISPLAY_TITLE": "Normal 1s song175", + "DURATION": 1110 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song176", + "DISPLAY_TITLE": "Normal 7s song176", + "DURATION": 7916 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song177", + "DISPLAY_TITLE": "Normal 5s song177", + "DURATION": 5409 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song178", + "DISPLAY_TITLE": "Normal 9s song178", + "DURATION": 9773 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song179", + "DISPLAY_TITLE": "Normal 5s song179", + "DURATION": 5530 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 7s song180", + "DISPLAY_TITLE": "Normal 7s song180", + "DURATION": 7317 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song181", + "DISPLAY_TITLE": "Normal 6s song181", + "DURATION": 6614 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song182", + "DISPLAY_TITLE": "Normal 4s song182", + "DURATION": 4503 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song183", + "DISPLAY_TITLE": "Normal 9s song183", + "DURATION": 9234 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song184", + "DISPLAY_TITLE": "Normal 3s song184", + "DURATION": 3411 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 3s song185", + "DISPLAY_TITLE": "Normal 3s song185", + "DURATION": 3040 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 9s song186", + "DISPLAY_TITLE": "Normal 9s song186", + "DURATION": 9605 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song187", + "DISPLAY_TITLE": "Normal 2s song187", + "DURATION": 2432 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song188", + "DISPLAY_TITLE": "Normal 5s song188", + "DURATION": 5484 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song189", + "DISPLAY_TITLE": "Normal 2s song189", + "DURATION": 2506 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song190", + "DISPLAY_TITLE": "Normal 5s song190", + "DURATION": 5558 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song191", + "DISPLAY_TITLE": "Normal 5s song191", + "DURATION": 5374 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song192", + "DISPLAY_TITLE": "Normal 6s song192", + "DURATION": 6146 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song193", + "DISPLAY_TITLE": "Normal 5s song193", + "DURATION": 5933 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 5s song194", + "DISPLAY_TITLE": "Normal 5s song194", + "DURATION": 5250 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song195", + "DISPLAY_TITLE": "Normal 6s song195", + "DURATION": 6438 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song196", + "DISPLAY_TITLE": "Normal 2s song196", + "DURATION": 2766 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 2s song197", + "DISPLAY_TITLE": "Normal 2s song197", + "DURATION": 2966 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 8s song198", + "DISPLAY_TITLE": "Normal 8s song198", + "DURATION": 8475 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 4s song199", + "DISPLAY_TITLE": "Normal 4s song199", + "DURATION": 4945 + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "hundreds_songs normal 6s song200", + "DISPLAY_TITLE": "Normal 6s song200", + "DURATION": 6697 + } + } + ] +} diff --git a/TestMediaApp/assets/media_items/toggles.json b/TestMediaApp/assets/media_items/toggles.json new file mode 100644 index 0000000..c12be00 --- /dev/null +++ b/TestMediaApp/assets/media_items/toggles.json @@ -0,0 +1,66 @@ +{ + "FLAGS": "browsable", + + "METADATA": { + "MEDIA_ID": "toggles", + "DISPLAY_TITLE": "Toggles" + }, + + "CHILDREN": [ + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "toggles Toggle Empty tab", + "DISPLAY_TITLE": "Toggle Empty tab on play", + "DURATION": 3000000 + }, + "EVENTS": [ + { "STATE": "PLAYING", "TOGGLE_ITEM": "only_nodes empty node 1" } + ] + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "toggles Toggle node toggles", + "DISPLAY_TITLE": "Toggle Node toggles node on play", + "DURATION": 3000000 + }, + "EVENTS": [ + { "STATE": "PLAYING", "TOGGLE_ITEM": "advanced toggles" } + ] + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "toggles Toggle Album Art", + "DISPLAY_TITLE": "Toggle Album Art on play", + "DURATION": 3000000 + }, + "EVENTS": [ + { "STATE": "PLAYING", "TOGGLE_ITEM": "advanced art nodes" } + ] + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "toggles Toggle Nature 64", + "DISPLAY_TITLE": "Toggle Nature 64 on play", + "DURATION": 3000000 + }, + "EVENTS": [ + { "STATE": "PLAYING", "TOGGLE_ITEM": "album_art/art_nodes nature 64" } + ] + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "toggles Toggle Advanced tab", + "DISPLAY_TITLE": "Toggle Advanced tab on play", + "DURATION": 3000000 + }, + "EVENTS": [ + { "STATE": "PLAYING", "TOGGLE_ITEM": "only_nodes advanced" } + ] + } + ] +}
\ No newline at end of file diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java index 61b3a31..c187448 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java @@ -33,7 +33,6 @@ import androidx.annotation.Nullable; import androidx.media.MediaBrowserServiceCompat; import com.android.car.media.testmediaapp.loader.TmaLoader; -import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs; 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.TmaReplyDelay; @@ -41,6 +40,7 @@ import com.android.car.media.testmediaapp.prefs.TmaPrefs; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -148,7 +148,7 @@ public class TmaBrowser extends MediaBrowserServiceCompat { getResources().getString(R.string.no_account), getResources().getString(R.string.select_account), TmaMediaEvent.ResolutionIntent.PREFS, - TmaMediaEvent.Action.NONE, 0, null)); + TmaMediaEvent.Action.NONE, 0, null, null)); } else { // TODO don't reset error in all cases... PlaybackStateCompat.Builder playbackState = new PlaybackStateCompat.Builder(); @@ -193,6 +193,10 @@ public class TmaBrowser extends MediaBrowserServiceCompat { getMediaItemsWithDelay(ROOT_ID, result, query); } + private TmaMediaItem getRoot() { + return mLibrary.getRoot(mPrefs.mRootNodeType.getValue()); + } + private void getMediaItemsWithDelay(@NonNull String parentId, @NonNull Result<List<MediaItem>> result, @Nullable String filter) { // TODO: allow per item override of the delay ? @@ -202,7 +206,7 @@ public class TmaBrowser extends MediaBrowserServiceCompat { if (TmaAccountType.NONE.equals(mPrefs.mAccountType.getValue())) { node = null; } else if (ROOT_ID.equals(parentId)) { - node = mLibrary.getRoot(mPrefs.mRootNodeType.getValue()); + node = getRoot(); } else { node = mLibrary.getMediaItemById(parentId); } @@ -224,7 +228,11 @@ public class TmaBrowser extends MediaBrowserServiceCompat { int selfUpdateDelay = node.getSelfUpdateDelay(); int toShow = (selfUpdateDelay > 0) ? 1 + node.mRevealCounter : childrenCount; for (int childIndex = 0 ; childIndex < toShow; childIndex++) { - items.add(children.get(childIndex).toMediaItem()); + TmaMediaItem child = children.get(childIndex); + if (child.mIsHidden) { + continue; + } + items.add(child.toMediaItem()); } result.sendResult(items); @@ -250,6 +258,9 @@ public class TmaBrowser extends MediaBrowserServiceCompat { } for (TmaMediaItem child : node.getChildren()) { + if (child.mIsHidden) { + continue; + } MediaItem item = child.toMediaItem(); CharSequence title = item.getDescription().getTitle(); if (title != null) { @@ -265,6 +276,20 @@ public class TmaBrowser extends MediaBrowserServiceCompat { } } + void toggleItem(@Nullable TmaMediaItem item) { + if (item == null) { + return; + } + item.mIsHidden = !item.mIsHidden; + if (item.getParent() != null) { + String parentId = item.getParent().getMediaId(); + if (Objects.equals(parentId, getRoot().getMediaId())) { + parentId = ROOT_ID; + } + notifyChildrenChanged(parentId); + } + } + private class UpdateNodeTask implements Runnable { private final String mNodeId; diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaEvent.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaEvent.java index 491f940..8fe30ef 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaEvent.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaEvent.java @@ -53,7 +53,7 @@ public class TmaMediaEvent { public static final TmaMediaEvent INSTANT_PLAYBACK = new TmaMediaEvent(EventState.PLAYING, StateErrorCode.UNKNOWN_ERROR, null, null, - ResolutionIntent.NONE, Action.NONE, 0, null); + ResolutionIntent.NONE, Action.NONE, 0, null, null); /** The name of each entry is the value used in the json file. */ public enum EventState { @@ -120,10 +120,11 @@ public class TmaMediaEvent { /** How long to wait before sending the event to the app. */ final int mPostDelayMs; private final String mExceptionClass; + final String mMediaItemIdToToggle; public TmaMediaEvent(EventState state, StateErrorCode errorCode, String errorMessage, String actionLabel, ResolutionIntent resolutionIntent, Action action, int postDelayMs, - String exceptionClass) { + String exceptionClass, String mediaItemIdToToggle) { mState = state; mErrorCode = errorCode; mErrorMessage = errorMessage; @@ -132,6 +133,7 @@ public class TmaMediaEvent { mAction = action; mPostDelayMs = postDelayMs; mExceptionClass = exceptionClass; + mMediaItemIdToToggle = mediaItemIdToToggle; } boolean premiumAccountRequired() { diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java index e2cb533..a759eb4 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java @@ -78,9 +78,9 @@ public class TmaMediaItem { /** Internally modifiable list (for includes). */ - private final List<TmaMediaItem> mChildren; - /** Read only list. */ - private final List<TmaMediaItem> mPlayableChildren; + private final List<TmaMediaItem> mChildren = new ArrayList<>(); + /** Internally modifiable list (for includes). */ + private final List<TmaMediaItem> mPlayableChildren = new ArrayList<>(); /** Read only list. */ final List<TmaCustomAction> mCustomActions; /** Read only list. Events triggered when starting the playback. */ @@ -91,6 +91,7 @@ public class TmaMediaItem { private @Nullable TmaMediaItem mParent; int mHearts; int mRevealCounter; + boolean mIsHidden = false; public TmaMediaItem(int flags, ContentStyle playableStyle, ContentStyle browsableStyle, @@ -103,17 +104,9 @@ public class TmaMediaItem { mMediaMetadata = metadata; mSelfUpdateMs = selfUpdateMs; mCustomActions = Collections.unmodifiableList(customActions); - mChildren = children; mMediaEvents = Collections.unmodifiableList(mediaEvents); mInclude = include; - List<TmaMediaItem> playableChildren = new ArrayList<>(children.size()); - for (TmaMediaItem child: mChildren) { - child.setParent(this); - if ((child.mFlags & FLAG_PLAYABLE) != 0) { - playableChildren.add(child); - } - } - mPlayableChildren = Collections.unmodifiableList(playableChildren); + setChildren(children); } private void setParent(@Nullable TmaMediaItem parent) { @@ -171,6 +164,16 @@ public class TmaMediaItem { void setChildren(List<TmaMediaItem> children) { mChildren.clear(); mChildren.addAll(children); + + List<TmaMediaItem> playableChildren = new ArrayList<>(children.size()); + for (TmaMediaItem child: mChildren) { + child.setParent(this); + if ((child.mFlags & FLAG_PLAYABLE) != 0) { + playableChildren.add(child); + } + } + mPlayableChildren.clear(); + mPlayableChildren.addAll(playableChildren); } void updateSessionMetadata(MediaSessionCompat session) { diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java index 65cc787..43cf3af 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java @@ -32,7 +32,6 @@ import static android.support.v4.media.session.PlaybackStateCompat.STATE_ERROR; import androidx.annotation.Nullable; import android.app.PendingIntent; -import android.content.Context; import android.content.Intent; import android.media.AudioFocusRequest; import android.media.AudioManager; @@ -40,6 +39,7 @@ import android.os.Bundle; import android.os.Handler; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; +import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -59,7 +59,7 @@ public class TmaPlayer extends MediaSessionCompat.Callback { private static final String TAG = "TmaPlayer"; - private final Context mContext; + private final TmaBrowser mBrowser; private final TmaPrefs mPrefs; private final TmaLibrary mLibrary; private final AudioManager mAudioManager; @@ -78,10 +78,10 @@ public class TmaPlayer extends MediaSessionCompat.Callback { private TmaMediaItem mActiveItem; private int mNextEventIndex = -1; - TmaPlayer(Context context, TmaLibrary library, AudioManager audioManager, Handler handler, + TmaPlayer(TmaBrowser browser, TmaLibrary library, AudioManager audioManager, Handler handler, MediaSessionCompat session) { - mContext = context; - mPrefs = TmaPrefs.getInstance(mContext); + mBrowser = browser; + mPrefs = TmaPrefs.getInstance(mBrowser); mLibrary = library; mAudioManager = audioManager; mHandler = handler; @@ -101,9 +101,9 @@ public class TmaPlayer extends MediaSessionCompat.Callback { .setActions(addActions(ACTION_PAUSE)); if (ResolutionIntent.PREFS.equals(event.mResolutionIntent)) { Intent prefsIntent = new Intent(); - prefsIntent.setClass(mContext, TmaPrefsActivity.class); + prefsIntent.setClass(mBrowser, TmaPrefsActivity.class); prefsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, prefsIntent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(mBrowser, 0, prefsIntent, 0); Bundle extras = new Bundle(); extras.putString(MediaKeys.ERROR_RESOLUTION_ACTION_LABEL, event.mActionLabel); @@ -119,7 +119,7 @@ public class TmaPlayer extends MediaSessionCompat.Callback { private void setActiveItemState(PlaybackStateCompat.Builder state) { if (mActiveItem != null) { for (TmaCustomAction action : mActiveItem.mCustomActions) { - String name = mContext.getResources().getString(action.mNameId); + String name = mBrowser.getResources().getString(action.mNameId); state.addCustomAction(action.mId, name, action.mIcon); } state.setActiveQueueItemId(mActiveItem.getQueueId()); @@ -249,14 +249,14 @@ public class TmaPlayer extends MediaSessionCompat.Callback { mActiveItem.mHearts--; toast("" + mActiveItem.mHearts); } else if (TmaCustomAction.REQUEST_LOCATION.mId.equals(action)) { - mContext.startService(new Intent(mContext, TmaForegroundService.class)); + mBrowser.startService(new Intent(mBrowser, TmaForegroundService.class)); } } } /** Note: this is for quick feedback implementation, media apps should avoid toasts... */ private void toast(String message) { - Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); + Toast.makeText(mBrowser, message, Toast.LENGTH_LONG).show(); } private boolean audioFocusGranted() { @@ -268,6 +268,9 @@ public class TmaPlayer extends MediaSessionCompat.Callback { TmaMediaEvent event = mActiveItem.mMediaEvents.get(mNextEventIndex); event.maybeThrow(); + if (!TextUtils.isEmpty(event.mMediaItemIdToToggle)) { + mBrowser.toggleItem(mLibrary.getMediaItemById(event.mMediaItemIdToToggle)); + } if (event.premiumAccountRequired() && TmaAccountType.PAID.equals(mPrefs.mAccountType.getValue())) { diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaEventReader.java b/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaEventReader.java index 2222afa..4926146 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaEventReader.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaEventReader.java @@ -21,8 +21,6 @@ import static com.android.car.media.testmediaapp.loader.TmaLoaderUtils.getEnum; import static com.android.car.media.testmediaapp.loader.TmaLoaderUtils.getInt; import static com.android.car.media.testmediaapp.loader.TmaLoaderUtils.getString; -import android.util.Log; - import androidx.annotation.Nullable; import com.android.car.media.testmediaapp.TmaMediaEvent; @@ -57,7 +55,8 @@ class TmaMediaEventReader { ACTION, /** How long to wait before sending the event to the app. */ POST_DELAY_MS, - THROW_EXCEPTION + THROW_EXCEPTION, + TOGGLE_ITEM, } private static TmaMediaEventReader sInstance; @@ -92,6 +91,7 @@ class TmaMediaEventReader { getEnum(json, Keys.INTENT, mResolutionIntents, ResolutionIntent.NONE), getEnum(json, Keys.ACTION, mActions, Action.NONE), getInt(json, Keys.POST_DELAY_MS), - getString(json, Keys.THROW_EXCEPTION)); + getString(json, Keys.THROW_EXCEPTION), + getString(json, Keys.TOGGLE_ITEM)); } } |