diff options
Diffstat (limited to 'TestMediaApp')
-rw-r--r-- | TestMediaApp/Android.mk | 3 | ||||
-rw-r--r-- | TestMediaApp/AndroidManifest.xml | 9 | ||||
-rw-r--r-- | TestMediaApp/build.gradle | 60 | ||||
-rw-r--r-- | TestMediaApp/res/drawable/button_ripple_bg.xml | 2 | ||||
-rw-r--r-- | TestMediaApp/res/drawable/ic_close.xml | 27 | ||||
-rw-r--r-- | TestMediaApp/res/values/styles.xml | 7 | ||||
-rw-r--r-- | TestMediaApp/res/xml/automotive_app_desc.xml | 20 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java | 64 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java | 10 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java | 13 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java | 7 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java | 5 |
12 files changed, 199 insertions, 28 deletions
diff --git a/TestMediaApp/Android.mk b/TestMediaApp/Android.mk index b97a07e..67127e0 100644 --- a/TestMediaApp/Android.mk +++ b/TestMediaApp/Android.mk @@ -34,11 +34,12 @@ LOCAL_CERTIFICATE := platform LOCAL_MODULE_TAGS := optional # car_car is ok here because this is meant to simulate a third party media app +# Do NOT add dependencies preventing the app from being unbundled (compiled with gradle in Studio). LOCAL_STATIC_ANDROID_LIBRARIES := \ androidx.car_car \ androidx.appcompat_appcompat \ androidx.preference_preference \ - car-media-common + androidx.legacy_legacy-support-v4 LOCAL_USE_AAPT2 := true diff --git a/TestMediaApp/AndroidManifest.xml b/TestMediaApp/AndroidManifest.xml index 859815b..09e850c 100644 --- a/TestMediaApp/AndroidManifest.xml +++ b/TestMediaApp/AndroidManifest.xml @@ -17,9 +17,10 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.car.media.testmediaapp" > - <uses-sdk - android:minSdkVersion="21" - android:targetSdkVersion="28"/> + <uses-feature + android:name="android.hardware.type.automotive" + android:required="true"/> + <application android:allowBackup="true" @@ -65,6 +66,8 @@ <!-- To use the app on a phone. --> + <meta-data android:name="com.google.android.gms.car.application" + android:resource="@xml/automotive_app_desc"/> <activity android:name=".phone.TmaLauncherActivity" > <intent-filter> diff --git a/TestMediaApp/build.gradle b/TestMediaApp/build.gradle new file mode 100644 index 0000000..79fd66d --- /dev/null +++ b/TestMediaApp/build.gradle @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2019 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. + */ + + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.android.car.media.testmediaapp" + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + lintOptions { + abortOnError false + } + buildTypes { + release { + minifyEnabled false + } + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.media:media:1.0.1' + implementation 'androidx.preference:preference:1.0.0' +} diff --git a/TestMediaApp/res/drawable/button_ripple_bg.xml b/TestMediaApp/res/drawable/button_ripple_bg.xml index d012c94..9c99a25 100644 --- a/TestMediaApp/res/drawable/button_ripple_bg.xml +++ b/TestMediaApp/res/drawable/button_ripple_bg.xml @@ -17,4 +17,4 @@ <ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@*android:color/car_card_ripple_background" /> + android:color="@color/ripple_background_color" /> diff --git a/TestMediaApp/res/drawable/ic_close.xml b/TestMediaApp/res/drawable/ic_close.xml new file mode 100644 index 0000000..f4c1e3b --- /dev/null +++ b/TestMediaApp/res/drawable/ic_close.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2019 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. +--> + +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="56dp" + android:height="56dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FFF" + android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> +</vector>
\ No newline at end of file diff --git a/TestMediaApp/res/values/styles.xml b/TestMediaApp/res/values/styles.xml index cf316c5..6a8e8b1 100644 --- a/TestMediaApp/res/values/styles.xml +++ b/TestMediaApp/res/values/styles.xml @@ -16,8 +16,11 @@ */ --> <resources> - <style name="TestMediaAppTheme" parent="Theme.Car.Light.NoActionBar"> - <item name="android:windowBackground">@color/car_card_dark</item> + <style name="TestMediaAppTheme" parent="Theme.AppCompat.Light.NoActionBar"> + <item name="android:windowBackground">@color/window_background </item> </style> + <color name="window_background">#AAA</color> + <color name="ripple_background_color">#444</color> + </resources> diff --git a/TestMediaApp/res/xml/automotive_app_desc.xml b/TestMediaApp/res/xml/automotive_app_desc.xml new file mode 100644 index 0000000..3daa01a --- /dev/null +++ b/TestMediaApp/res/xml/automotive_app_desc.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (c) 2019, 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. + */ +--> +<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android"> + <uses name="media"/> +</automotiveApp>
\ No newline at end of file diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java b/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java new file mode 100644 index 0000000..8506b6b --- /dev/null +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2019, 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.car.media.testmediaapp; + +/** + * Copy of constants defined in com.android.car.media.common.MediaConstants until they can be moved + * to a shared location available to all media apps. This makes un-bundling TestMediaApp easier. + */ +public class MediaKeys { + + /** + * Bundle extra holding the Pending Intent to launch to let users resolve the current error. + * See {@link #ERROR_RESOLUTION_ACTION_LABEL} for more details. + */ + static final String ERROR_RESOLUTION_ACTION_INTENT = + "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT"; + + + /** + * Bundle extra indicating the label of the button users can tap to resolve an error state. + */ + static final String ERROR_RESOLUTION_ACTION_LABEL = + "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL"; + + /** + * Bundle extra indicating the presentation hint for playable media items. See {@link + * #CONTENT_STYLE_LIST_ITEM_HINT_VALUE} or {@link #CONTENT_STYLE_GRID_ITEM_HINT_VALUE} + */ + static final String CONTENT_STYLE_PLAYABLE_HINT = + "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT"; + + /** + * Bundle extra indicating the presentation hint for browsable media items. See {@link + * #CONTENT_STYLE_LIST_ITEM_HINT_VALUE} or {@link #CONTENT_STYLE_GRID_ITEM_HINT_VALUE} + */ + static final String CONTENT_STYLE_BROWSABLE_HINT = + "android.media.browse.CONTENT_STYLE_BROWSABLE_HINT"; + + /** + * Value for {@link #CONTENT_STYLE_PLAYABLE_HINT} and {@link #CONTENT_STYLE_BROWSABLE_HINT} that + * hints the corresponding items should be presented as lists. + */ + static final int CONTENT_STYLE_LIST_ITEM_HINT_VALUE = 1; + + /** + * Value for {@link #CONTENT_STYLE_PLAYABLE_HINT} and {@link #CONTENT_STYLE_BROWSABLE_HINT} that + * hints the corresponding items should be presented as grids. + */ + static final int CONTENT_STYLE_GRID_ITEM_HINT_VALUE = 2; +} diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java index ec57473..02e8292 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java @@ -33,10 +33,8 @@ import androidx.media.MediaBrowserServiceCompat; 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.TmaLoginEventOrder; import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaReplyDelay; import com.android.car.media.testmediaapp.prefs.TmaPrefs; -import com.android.internal.util.Preconditions; import java.util.ArrayList; import java.util.List; @@ -149,10 +147,10 @@ public class TmaBrowser extends MediaBrowserServiceCompat { if (QUEUE_ONLY.equals(mPrefs.mRootNodeType.getValue()) && ROOT_ID.equals(parentId)) { TmaMediaItem queue = mLibrary.getRoot(LEAF_CHILDREN); - Preconditions.checkNotNull(queue); - mSession.setQueue(queue.buildQueue()); - - mPlayer.prepareMediaItem(queue.getPlayableByIndex(0)); + if (queue != null) { + mSession.setQueue(queue.buildQueue()); + mPlayer.prepareMediaItem(queue.getPlayableByIndex(0)); + } } } diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java index 5c53d34..f79e273 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaMediaItem.java @@ -22,11 +22,6 @@ import static android.support.v4.media.MediaBrowserCompat.MediaItem.FLAG_PLAYABL import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DURATION; import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_MEDIA_ID; -import static com.android.car.media.common.MediaConstants.CONTENT_STYLE_BROWSABLE_HINT; -import static com.android.car.media.common.MediaConstants.CONTENT_STYLE_GRID_ITEM_HINT_VALUE; -import static com.android.car.media.common.MediaConstants.CONTENT_STYLE_LIST_ITEM_HINT_VALUE; -import static com.android.car.media.common.MediaConstants.CONTENT_STYLE_PLAYABLE_HINT; - import android.os.Bundle; import android.support.v4.media.MediaBrowserCompat.MediaItem; import android.support.v4.media.MediaDescriptionCompat; @@ -46,8 +41,8 @@ public class TmaMediaItem { /** The name of each entry is the value used in the json file. */ public enum ContentStyle { NONE (0), - LIST (CONTENT_STYLE_LIST_ITEM_HINT_VALUE), - GRID (CONTENT_STYLE_GRID_ITEM_HINT_VALUE); + LIST (MediaKeys.CONTENT_STYLE_LIST_ITEM_HINT_VALUE), + GRID (MediaKeys.CONTENT_STYLE_GRID_ITEM_HINT_VALUE); final int mBundleValue; ContentStyle(int value) { mBundleValue = value; @@ -212,8 +207,8 @@ public class TmaMediaItem { extras.putAll(metadataDescription.getExtras()); } - extras.putInt(CONTENT_STYLE_PLAYABLE_HINT, mPlayableStyle.mBundleValue); - extras.putInt(CONTENT_STYLE_BROWSABLE_HINT, mBrowsableStyle.mBundleValue); + extras.putInt(MediaKeys.CONTENT_STYLE_PLAYABLE_HINT, mPlayableStyle.mBundleValue); + extras.putInt(MediaKeys.CONTENT_STYLE_BROWSABLE_HINT, mBrowsableStyle.mBundleValue); bob.setExtras(extras); return bob.build(); diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java index 3df5653..2938a37 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java @@ -28,9 +28,6 @@ import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_T import static android.support.v4.media.session.PlaybackStateCompat.ERROR_CODE_APP_ERROR; import static android.support.v4.media.session.PlaybackStateCompat.STATE_ERROR; -import static com.android.car.media.common.MediaConstants.ERROR_RESOLUTION_ACTION_INTENT; -import static com.android.car.media.common.MediaConstants.ERROR_RESOLUTION_ACTION_LABEL; - import androidx.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; @@ -108,8 +105,8 @@ public class TmaPlayer extends MediaSessionCompat.Callback { PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, prefsIntent, 0); Bundle extras = new Bundle(); - extras.putString(ERROR_RESOLUTION_ACTION_LABEL, event.mActionLabel); - extras.putParcelable(ERROR_RESOLUTION_ACTION_INTENT, pendingIntent); + extras.putString(MediaKeys.ERROR_RESOLUTION_ACTION_LABEL, event.mActionLabel); + extras.putParcelable(MediaKeys.ERROR_RESOLUTION_ACTION_INTENT, pendingIntent); state.setExtras(extras); } diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java b/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java index 95f8f89..5a4a217 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java @@ -59,6 +59,7 @@ import org.json.JSONException; import org.json.JSONObject; import java.util.EnumSet; +import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -140,7 +141,9 @@ class TmaMediaMetadataReader { MediaMetadataCompat fromJson(JSONObject object) throws JSONException { MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); - for (String jsonKey : object.keySet()) { + Iterator<String> keys = object.keys(); + while (keys.hasNext()) { + String jsonKey = keys.next(); MetadataKey key = mMetadataKeys.get(jsonKey); if (key != null) { switch (key.mKeyType) { |