packages/apps/Car/Stream: Set LOCAL_SDK_VERSION where possible. am: 0af16e0a19 am: 0e11da1641
am: 2a69215c64  -s ours

Change-Id: I515a61557f13c1db26db190f15cdbd0c5b192044
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index f046515..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# Copyright (C) 2016 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.
-#
-ifneq ($(TARGET_BUILD_PDK), true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-include packages/apps/Car/libs/car-stream-ui-lib/car-stream-ui-lib.mk
-include packages/apps/Car/libs/car-apps-common/car-apps-common.mk
-
-include packages/services/Car/car-support-lib/car-support.mk
-
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
-LOCAL_STATIC_JAVA_LIBRARIES += car-stream-lib
-
-LOCAL_AAPT_FLAGS += \
-        --auto-add-overlay \
-
-LOCAL_AAPT_FLAGS += --extra-packages com.android.car.radio.service
-LOCAL_STATIC_JAVA_LIBRARIES += car-radio-service
-
-LOCAL_PACKAGE_NAME := Stream
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_MODULE_TAGS := optional
-
-#TODO: determine if this service should be a privileged module.
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_DEX_PREOPT := false
-
-# Include support-v7-cardview, if not already included
-ifeq (,$(findstring android-support-v7-cardview,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_RESOURCE_DIR += frameworks/support/v7/cardview/res
-LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.cardview
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-cardview
-endif
-
-# Include support-v7-palette, if not already included
-ifeq (,$(findstring android-support-v7-palette,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.palette
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-palette
-endif
-
-# Include android-support-annotations, if not already included
-ifeq (,$(findstring android-support-annotations,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-annotations
-endif
-
-include $(BUILD_PACKAGE)
-
-endif
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
deleted file mode 100644
index 8bc0317..0000000
--- a/AndroidManifest.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2016 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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.car.stream">
-    <uses-sdk
-            android:minSdkVersion="23"
-            android:targetSdkVersion='23'/>
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-    <uses-permission android:name="android.permission.READ_CONTACTS" />
-    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
-    <uses-permission android:name="android.permission.CALL_PHONE" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
-    <uses-permission android:name="android.permission.WAKE_LOCK"/>
-    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.RECEIVE_SMS" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="com.google.android.car.LAUNCH_PROJECTION_APP" />
-    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
-    <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
-    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
-    <uses-permission android:name="android.permission.MANAGE_USERS" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
-    <application android:label="CarStreamService"
-                 android:name="com.android.car.stream.StreamApplication"
-                 android:persistent="true">
-        <activity android:name="com.android.car.stream.PermissionsActivity"
-                  android:theme="@android:style/Theme.NoTitleBar"
-                  android:resizeableActivity="true"
-                  android:launchMode="singleTask"
-                  android:label="StreamPermissionActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-        <service
-                android:name="com.android.car.stream.StreamService"
-                android:exported="true">
-            <intent-filter>
-                <action android:name="stream.service"/>
-            </intent-filter>
-        </service>
-
-        <service android:name="com.android.car.stream.notifications.StreamNotificationListenerService"
-                 android:label="Stream Notification Listener"
-                 android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
-            <intent-filter>
-                <action android:name="android.service.notification.NotificationListenerService" />
-            </intent-filter>
-        </service>
-
-        <service android:name="com.android.car.stream.telecom.StreamInCallService"
-                 android:permission="android.permission.BIND_INCALL_SERVICE"
-                 android:exported="true">
-             <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="false" />
-             <intent-filter>
-                 <action android:name="android.telecom.InCallService"/>
-             </intent-filter>
-        </service>
-    </application>
-</manifest>
diff --git a/res/drawable/ic_call_black.xml b/res/drawable/ic_call_black.xml
deleted file mode 100644
index 4a34968..0000000
--- a/res/drawable/ic_call_black.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-        android:pathData="M0 0h48v48H0z" />
-    <path
-        android:fillColor="#000000"
-        android:pathData="M13.25 21.59c2.88 5.66 7.51 10.29 13.18 13.17l4.4-4.41c.55-.55 1.34-.71
-2.03-.49C35.1 30.6 37.51 31 40 31c1.11 0 2 .89 2 2v7c0 1.11-.89 2-2 2C21.22 42 6
-26.78 6 8c0-1.11 .9 -2 2-2h7c1.11 0 2 .89 2 2 0 2.49 .4 4.9 1.14 7.14 .22 .69
-.06 1.48-.49 2.03l-4.4 4.42z" />
-</vector>
diff --git a/res/drawable/ic_call_missed.xml b/res/drawable/ic_call_missed.xml
deleted file mode 100644
index b2e065e..0000000
--- a/res/drawable/ic_call_missed.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-
-    <path
-        android:pathData="M0 0h24v24H0z" />
-    <path
-        android:fillColor="@color/car_red_500"
-        android:pathData="M19.59 7L12 14.59 6.41 9H11V7H3v8h2v-4.59l7 7 9-9z" />
-</vector>
diff --git a/res/drawable/ic_mic.xml b/res/drawable/ic_mic.xml
deleted file mode 100644
index 12e451a..0000000
--- a/res/drawable/ic_mic.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:fillColor="#FFFFFF"
-            android:pathData="M24 28c3.31 0 5.98-2.69 5.98-6L30 10c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0
-3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0
-6.83 5.44 12.47 12 13.44V42h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_mic_muted.xml b/res/drawable/ic_mic_muted.xml
deleted file mode 100644
index b46a00a..0000000
--- a/res/drawable/ic_mic_muted.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:pathData="M0 0h48v48H0zm0 0h48v48H0z" />
-    <path
-            android:fillColor="#FFFFFF"
-            android:pathData="M38 22h-3.4c0 1.49-.31 2.87-.87 4.1l2.46 2.46C37.33 26.61 38 24.38 38 22zm-8.03
-.33 c0-.11 .03 -.22 .03 -.33V10c0-3.32-2.69-6-6-6s-6 2.68-6 6v.37l11.97
-11.96zM8.55 6L6 8.55l12.02 12.02v1.44c0 3.31 2.67 6 5.98 6 .45 0 .88-.06
-1.3-.15l3.32 3.32c-1.43 .66 -3 1.03-4.62 1.03-5.52 0-10.6-4.2-10.6-10.2H10c0
-6.83 5.44 12.47 12 13.44V42h4v-6.56c1.81-.27 3.53-.9 5.08-1.81L39.45 42 42 39.46
-8.55 6z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_pause.xml b/res/drawable/ic_pause.xml
deleted file mode 100644
index 638e987..0000000
--- a/res/drawable/ic_pause.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:fillColor="#000000"
-            android:pathData="M12 38h8V10h-8v28zm16-28v28h8V10h-8z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_pause_light.xml b/res/drawable/ic_pause_light.xml
deleted file mode 100644
index 11784f3..0000000
--- a/res/drawable/ic_pause_light.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:fillColor="#FFFFFF"
-            android:pathData="M12 38h8V10h-8v28zm16-28v28h8V10h-8z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
diff --git a/res/drawable/ic_phone.xml b/res/drawable/ic_phone.xml
deleted file mode 100644
index 015338f..0000000
--- a/res/drawable/ic_phone.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="56dp"
-        android:height="56dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-            android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"
-            android:fillColor="#000000"/>
-</vector>
diff --git a/res/drawable/ic_phone_hangup.xml b/res/drawable/ic_phone_hangup.xml
deleted file mode 100644
index 7af35f1..0000000
--- a/res/drawable/ic_phone_hangup.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-            android:pathData="M12,9c-1.6,0 -3.15,0.25 -4.6,0.72v3.1c0,0.39 -0.23,0.74 -0.56,0.9 -0.98,0.49 -1.87,1.12 -2.66,1.85 -0.18,0.18 -0.43,0.28 -0.7,0.28 -0.28,0 -0.53,-0.11 -0.71,-0.29L0.29,13.08c-0.18,-0.17 -0.29,-0.42 -0.29,-0.7 0,-0.28 0.11,-0.53 0.29,-0.71C3.34,8.78 7.46,7 12,7s8.66,1.78 11.71,4.67c0.18,0.18 0.29,0.43 0.29,0.71 0,0.28 -0.11,0.53 -0.29,0.71l-2.48,2.48c-0.18,0.18 -0.43,0.29 -0.71,0.29 -0.27,0 -0.52,-0.11 -0.7,-0.28 -0.79,-0.74 -1.69,-1.36 -2.67,-1.85 -0.33,-0.16 -0.56,-0.5 -0.56,-0.9v-3.1C15.15,9.25 13.6,9 12,9z"
-            android:fillColor="#ffffff"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_play_arrow.xml b/res/drawable/ic_play_arrow.xml
deleted file mode 100644
index 753afe7..0000000
--- a/res/drawable/ic_play_arrow.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:pathData="M-838-2232H562v3600H-838z" />
-    <path
-            android:fillColor="#000000"
-            android:pathData="M16 10v28l22-14z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_play_arrow_light.xml b/res/drawable/ic_play_arrow_light.xml
deleted file mode 100644
index 41ec9ef..0000000
--- a/res/drawable/ic_play_arrow_light.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:pathData="M-838-2232H562v3600H-838z" />
-    <path
-            android:fillColor="#FFFFFF"
-            android:pathData="M16 10v28l22-14z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
diff --git a/res/drawable/ic_skip_next.xml b/res/drawable/ic_skip_next.xml
deleted file mode 100644
index 29334a3..0000000
--- a/res/drawable/ic_skip_next.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-    <path
-            android:fillColor="#FFFFFF"
-            android:pathData="M12 36l17-12-17-12v24zm20-24v24h4V12h-4z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_skip_previous.xml b/res/drawable/ic_skip_previous.xml
deleted file mode 100644
index 0a19a6f..0000000
--- a/res/drawable/ic_skip_previous.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-    <path
-            android:fillColor="#FFFFFF"
-            android:pathData="M12 12h4v24h-4zm7 12l17 12V12z" />
-    <path
-            android:pathData="M0 0h48v48H0z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_stop.xml b/res/drawable/ic_stop.xml
deleted file mode 100644
index 105e269..0000000
--- a/res/drawable/ic_stop.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48"
-        android:viewportHeight="48">
-
-    <path
-            android:pathData="M0 0h48v48H0z" />
-    <path
-            android:fillColor="#000000"
-            android:pathData="M12 12h24v24H12z" />
-</vector>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
deleted file mode 100644
index 415049a..0000000
--- a/res/values/colors.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-<resources>
-    <!-- The main accent color of the radio app. -->
-    <color name="car_radio_accent_color">#e91e63</color>  <!-- Pink 500 -->
-</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
deleted file mode 100644
index 936f912..0000000
--- a/res/values/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2016 Google Inc. All Rights Reserved. -->
-<resources>
-    <dimen name="stream_card_secondary_icon_dimen">96dp</dimen>
-    <dimen name="stream_media_icon_size">128dp</dimen>
-</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
deleted file mode 100644
index 751fabf..0000000
--- a/res/values/strings.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2016 Google Inc. All Rights Reserved. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <!-- Permission -->
-    <skip/>
-    <!-- Generic instruction on how to enable permissions for Android Auto [CHAR LIMIT=200] -->
-    <string name="permissions_generic">Use your phone to turn on the permissions in\nSettings > Apps > Android Auto > Permissions</string>
-
-    <string name="permission_not_granted">The following permissions where not granted:<xliff:g id="temperature">%1$s</xliff:g></string>
-    <string name="all_permission_granted">All permissions granted, starting service</string>
-    <string name="permission_dialog_title">Permissions</string>
-    <string name="permission_dialog_positive_button_text">Ok</string>
-
-    <!-- Label for a recent call card [CHAR LIMIT=30] -->
-    <string name="recent_call">Recent call</string>
-
-    <string name="car_notification_permission_dialog_title">Notification access request</string>
-    <string name="car_notification_permission_dialog_text">Please enable notification access and then hit the home button</string>
-
-    <!-- Telecom Related strings-->
-    <!-- Label for voicemail [CHAR LIMIT=30] -->
-    <string name="voicemail">Voicemail</string>
-    <!-- Label for current phone call [CHAR LIMIT=30] -->
-    <string name="unknown_number">Current call</string>
-    <!-- Label for incoming call [CHAR LIMIT=30] -->
-    <string name="notification_incoming_call">Select to answer</string>
-    <!-- Label for button to answer a phone call [CHAR LIMIT=30] -->
-    <string name="answer_call">Answer</string>
-    <!-- Label for button to reject a phone call [CHAR LIMIT=30] -->
-    <string name="reject_call">Reject</string>
-    <!-- Label for when a call is coming from an unknown caller [CHAR LIMIT=30] -->
-    <string name="unknown">Unknown</string>
-    <!-- Label for when a call is a conference call [CHAR LIMIT=30] -->
-    <string name="conference_call">Conference call</string>
-    <!-- Label for the currently ongoing call [CHAR LIMIT=30] -->
-    <string name="ongoing_call">Active &#8226; </string>
-    <!-- Label for the currently dialed call [CHAR LIMIT=30] -->
-    <string name="dialing_call">Dialing</string>
-    <!-- Label for a call being disconnected [CHAR LIMIT=30] -->
-    <string name="disconnecting_call">Disconnecting Call</string>
-
-    <!-- Text for the radio application. -->
-    <string name="radio_app_name">Radio</string>
-
-    <!-- Text to denote the AM radio band. -->
-    <string name="radio_am_text">AM</string>
-
-    <!-- Text to denote the FM radio band. -->
-    <string name="radio_fm_text">FM</string>
-
-    <string name="car_media_component_package" translatable="false">com.android.car.media</string>
-
-    <string name="car_radio_component_package" translatable="false">com.android.car.radio</string>
-    <string name="car_radio_component_service" translatable="false">com.android.car.radio.RadioService</string>
-    <string name="car_radio_component_activity" translatable="false">com.android.car.radio.CarRadioProxyActivity</string>
-</resources>
diff --git a/src/com/android/car/stream/BitmapUtils.java b/src/com/android/car/stream/BitmapUtils.java
deleted file mode 100644
index e68b2ae..0000000
--- a/src/com/android/car/stream/BitmapUtils.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.VectorDrawable;
-import android.support.annotation.Nullable;
-
-/**
- * Utility class for manipulating Bitmaps.
- */
-public class BitmapUtils {
-    private BitmapUtils() {}
-
-    /**
-     * Returns a {@link Bitmap} from a {@link VectorDrawable}.
-     * {@link android.graphics.BitmapFactory#decodeResource(Resources, int)} cannot be used to
-     * retrieve a bitmap from a VectorDrawable, so this method works around that.
-     */
-    @Nullable
-    public static Bitmap getBitmap(VectorDrawable vectorDrawable) {
-        if (vectorDrawable == null) {
-            return null;
-        }
-
-        Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
-                vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
-        vectorDrawable.draw(canvas);
-        return bitmap;
-    }
-}
diff --git a/src/com/android/car/stream/PermissionsActivity.java b/src/com/android/car/stream/PermissionsActivity.java
deleted file mode 100644
index 16e7719..0000000
--- a/src/com/android/car/stream/PermissionsActivity.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.ComponentName;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.util.Log;
-import com.android.car.stream.notifications.StreamNotificationListenerService;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A trampoline activity that checks if all permissions necessary are granted.
- */
-public class PermissionsActivity extends Activity {
-    private static final String TAG = "PermissionsActivity";
-    private static final String NOTIFICATION_LISTENER_ENABLED = "enabled_notification_listeners";
-
-    public static final int CAR_PERMISSION_REQUEST_CODE = 1013; // choose a unique number
-
-    private static final String[] PERMISSIONS = new String[]{
-            android.Manifest.permission.READ_PHONE_STATE,
-            android.Manifest.permission.CALL_PHONE,
-            android.Manifest.permission.READ_CALL_LOG,
-            android.Manifest.permission.READ_CONTACTS,
-            android.Manifest.permission.ACCESS_FINE_LOCATION,
-            android.Manifest.permission.RECEIVE_SMS,
-            android.Manifest.permission.READ_EXTERNAL_STORAGE
-    };
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        boolean permissionsCheckOnly = getIntent().getExtras()
-                .getBoolean(StreamConstants.STREAM_PERMISSION_CHECK_PERMISSIONS_ONLY);
-
-        if (permissionsCheckOnly) {
-            boolean allPermissionsGranted = hasNotificationListenerPermission()
-                    && arePermissionGranted(PERMISSIONS);
-            setResult(allPermissionsGranted ? RESULT_OK : RESULT_CANCELED);
-            finish();
-            return;
-        }
-
-        if (!hasNotificationListenerPermission()) {
-            showNotificationListenerSettings();
-        } else {
-            maybeRequestPermissions();
-        }
-    }
-
-    private void maybeRequestPermissions() {
-        boolean permissionGranted = arePermissionGranted(PERMISSIONS);
-        if (!permissionGranted) {
-            requestPermissions(PERMISSIONS, CAR_PERMISSION_REQUEST_CODE);
-        } else {
-            startService(new Intent(this, StreamService.class));
-            finish();
-        }
-    }
-
-    @Override
-    public void onRequestPermissionsResult(int requestCode, String[] permissions,
-            int[] grantResults) {
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-
-        if (requestCode == CAR_PERMISSION_REQUEST_CODE) {
-            List<String> granted = new ArrayList<>();
-            List<String> notGranted = new ArrayList<>();
-            for (int i = 0; i < permissions.length; i++) {
-                String permission = permissions[i];
-                int grantResult = grantResults[i];
-                if (grantResult == PackageManager.PERMISSION_GRANTED) {
-                    granted.add(permission);
-                } else {
-                    notGranted.add(permission);
-                }
-            }
-
-            if (notGranted.size() > 0) {
-                StringBuilder stb = new StringBuilder();
-                for (String s : notGranted) {
-                    stb.append(" ").append(s);
-                }
-                showDialog(getString(R.string.permission_not_granted, stb.toString()));
-            } else {
-                showDialog(getString(R.string.all_permission_granted));
-                startService(new Intent(this, StreamService.class));
-            }
-
-            if (arePermissionGranted(PERMISSIONS)) {
-                setResult(Activity.RESULT_OK);
-            }
-            finish();
-        }
-    }
-
-    private void showDialog(String message) {
-        new AlertDialog.Builder(this /* context */)
-                .setTitle(getString(R.string.permission_dialog_title))
-                .setMessage(message)
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setPositiveButton(
-                        getString(R.string.permission_dialog_positive_button_text),
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int id) {
-                                dialog.cancel();
-                            }
-                        })
-                .show();
-    }
-
-    private boolean arePermissionGranted(String[] permissions) {
-        for (String permission : permissions) {
-            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
-                Log.e(TAG, "Permission is not granted: " + permission);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean hasNotificationListenerPermission() {
-        ComponentName notificationListener = new ComponentName(this,
-                StreamNotificationListenerService.class);
-        String listeners = Settings.Secure.getString(getContentResolver(),
-                NOTIFICATION_LISTENER_ENABLED);
-        return listeners != null && listeners.contains(notificationListener.flattenToString());
-    }
-
-    private void showNotificationListenerSettings() {
-        AlertDialog dialog = new AlertDialog.Builder(this)
-                .setTitle(getString(R.string.car_notification_permission_dialog_title))
-                .setMessage(getString(R.string.car_notification_permission_dialog_text))
-                .setCancelable(false)
-                .setNeutralButton(getString(android.R.string.ok),
-                        new DialogInterface.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int id) {
-                                dialog.cancel();
-                                Intent settingsIntent =
-                                        new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
-                                startActivity(settingsIntent);
-                            }
-                        })
-                .create();
-        dialog.show();
-    }
-}
diff --git a/src/com/android/car/stream/StreamApplication.java b/src/com/android/car/stream/StreamApplication.java
deleted file mode 100644
index e01e2e7..0000000
--- a/src/com/android/car/stream/StreamApplication.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream;
-
-import android.app.Application;
-import android.content.Intent;
-import android.util.Log;
-import com.android.car.stream.media.MediaStreamProducer;
-import com.android.car.stream.radio.RadioStreamProducer;
-import com.android.car.stream.telecom.CurrentCallStreamProducer;
-import com.android.car.stream.telecom.RecentCallStreamProducer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Base application for {@link StreamService}
- */
-public class StreamApplication extends Application {
-    private static final String TAG = "StreamApplication";
-    private List<StreamProducer> streamProducers;
-
-    @Override
-    public void onCreate() {
-        // TODO(victorchan): start and bind stream service, then pass in bound instance to
-        // producers.
-        startService(new Intent(this, StreamService.class));
-
-        super.onCreate();
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "stream application started");
-        }
-        streamProducers = new ArrayList<>();
-        streamProducers.add(new CurrentCallStreamProducer(this /* context */));
-        streamProducers.add(new RecentCallStreamProducer(this /* context */));
-        streamProducers.add(new MediaStreamProducer(this /* context */));
-        streamProducers.add(new RadioStreamProducer(this /* context */));
-
-        startProducers();
-    }
-
-    @Override
-    public void onTerminate() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "StreamApplication terminated");
-        }
-        super.onTerminate();
-        stopProducers();
-    }
-
-    private void startProducers() {
-        for (int i = 0; i < streamProducers.size(); i++) {
-            streamProducers.get(i).start();
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Stream producers started: "
-                        + streamProducers.get(i).getClass().getName());
-            }
-        }
-    }
-
-    private void stopProducers() {
-        for (int i = 0; i < streamProducers.size(); i++) {
-            streamProducers.get(i).stop();
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Stream producers stopped: "
-                        + streamProducers.get(i).getClass().getName());
-            }
-        }
-    }
-}
diff --git a/src/com/android/car/stream/StreamProducer.java b/src/com/android/car/stream/StreamProducer.java
deleted file mode 100644
index d4971fc..0000000
--- a/src/com/android/car/stream/StreamProducer.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.support.annotation.CallSuper;
-import android.util.Log;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Queue;
-
-/**
- * A base class that produces {@link StreamCard} for the StreamService
- */
-public abstract class StreamProducer {
-    private static final String TAG = "StreamProducer";
-
-    protected final Context mContext;
-
-    /**
-     * A queue that holds {@link StreamCard}s that were added before this {@link StreamProducer}
-     * has connected to the {@link StreamService}. After connecting, these cards are posted to
-     * the StreamService.
-     */
-    private final Queue<StreamCard> mQueuedCards = new LinkedList<>();
-
-    private StreamService mStreamService;
-
-    public StreamProducer(Context context) {
-        mContext = context;
-    }
-
-    /**
-     * Posts the given card to the {@link StreamService} for rendering by stream consumers.
-     *
-     * @return {@code true} if the card was successfully posted. {@code false} is returned if the
-     * {@link StreamService} is not available. The given card will be queued and posted when the
-     * {@link StreamService} becomes available.
-     */
-    public final boolean postCard(StreamCard card) {
-        if (mStreamService != null) {
-            mStreamService.addStreamCard(card);
-            return true;
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "StreamService not found, adding card to queue for later addition.");
-        }
-
-        mQueuedCards.add(card);
-        return false;
-    }
-
-    /**
-     * Removes the given card from the {@link StreamService}. If this {@link StreamProducer} has not
-     * connected to the {@link StreamService}, then {@link #mQueuedCards} is checked to see if it
-     * contains the given card.
-     *
-     * @return {@code true} if the card is successfully removed from either the
-     * {@link StreamService} or {@link #mQueuedCards}.
-     */
-    public final boolean removeCard(StreamCard card) {
-        if (card == null) {
-            return false;
-        }
-
-        if (mStreamService != null) {
-            mStreamService.removeStreamCard(card);
-            return true;
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "StreamService not found, checking if it exists in the queue.");
-        }
-
-        for (Iterator<StreamCard> iterator = mQueuedCards.iterator(); iterator.hasNext();) {
-            StreamCard queuedCard = iterator.next();
-            if (queuedCard.getType() == card.getType() && queuedCard.getId() == card.getId()) {
-                iterator.remove();
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public void onCardDismissed(StreamCard card) {
-        // Handle when a StreamCard is dismissed.
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Stream Card dismissed: " + card);
-        }
-    }
-
-    /**
-     * Start the producer and connect to the {@link StreamService}
-     */
-    @CallSuper
-    public void start() {
-        Intent streamServiceIntent = new Intent(mContext, StreamService.class);
-        streamServiceIntent.setAction(StreamConstants.STREAM_PRODUCER_BIND_ACTION);
-        mContext.bindService(streamServiceIntent, mServiceConnection, 0 /* flags */);
-    }
-
-    /**
-     * Stop the producer.
-     */
-    @CallSuper
-    public void stop() {
-        mContext.unbindService(mServiceConnection);
-        mQueuedCards.clear();
-    }
-
-    private ServiceConnection mServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            StreamService.StreamProducerBinder binder
-                    = (StreamService.StreamProducerBinder) service;
-            mStreamService = binder.getService();
-
-            while (!mQueuedCards.isEmpty()) {
-                mStreamService.addStreamCard(mQueuedCards.remove());
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            mStreamService = null;
-        }
-    };
-}
diff --git a/src/com/android/car/stream/StreamService.java b/src/com/android/car/stream/StreamService.java
deleted file mode 100644
index 75a2c38..0000000
--- a/src/com/android/car/stream/StreamService.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Binder;
-import android.os.DeadObjectException;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.Pair;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-/**
- * A service that manages the {@link StreamCard} being generated by the system and notifies
- * the {@link IStreamConsumer} that new cards are available.
- */
-public class StreamService extends Service {
-    private static final String TAG = "StreamService";
-    private static final int DEFAULT_STREAM_CONSUMER_COUNT = 3;
-
-    // The StreamCard is identified by a key which is comprised of its type and id
-    private LinkedHashMap<Pair<Integer, Long>, StreamCard> mStreamCards = new LinkedHashMap<>();
-
-    private List<IStreamConsumer> mConsumers = new ArrayList<>(DEFAULT_STREAM_CONSUMER_COUNT);
-
-    private final IBinder mStreamProducerBinder = new StreamProducerBinder();
-
-
-    public class StreamProducerBinder extends Binder {
-        StreamService getService() {
-            return StreamService.this;
-        }
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onBind() calling process ID: " + Binder.getCallingPid()
-                    + " StreamService process ID: " + android.os.Process.myPid());
-        }
-
-        String action = intent.getAction();
-        switch(action){
-            case StreamConstants.STREAM_PRODUCER_BIND_ACTION:
-                return mStreamProducerBinder;
-            case StreamConstants.STREAM_CONSUMER_BIND_ACTION:
-                return mStreamConsumerService;
-            default:
-                return null;
-        }
-    }
-
-    private final IBinder mStreamConsumerService = new IStreamService.Stub() {
-        @Override
-        public void registerConsumer(IStreamConsumer consumer) throws RemoteException {
-            mConsumers.add(consumer);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Consumer registered, total # consumers: " + mConsumers.size());
-            }
-        }
-
-        @Override
-        public void unregisterConsumer(IStreamConsumer consumer) throws RemoteException {
-            mConsumers.remove(consumer);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Consumer removed, total # consumers: " + mConsumers.size());
-            }
-        }
-
-        @Override
-        public List<StreamCard> fetchAllStreamCards() throws RemoteException {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Fetching all stream items, # cards: " + mStreamCards.size());
-            }
-
-            List<StreamCard> cards = new ArrayList(mStreamCards.values());
-            return cards;
-        }
-
-        @Override
-        public void notifyStreamCardDismissed(StreamCard card) throws RemoteException {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "StreamCard dismissed");
-            }
-        }
-
-        @Override
-        public void notifyStreamCardInteracted(StreamCard card) throws RemoteException {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "StreamCard clicked");
-            }
-        }
-    };
-
-    /**
-     * Add a {@link StreamCard} to the StreamService. The {@link StreamCard} will be published to
-     * all IStreamListener registered with the StreamService.
-     */
-    public void addStreamCard(StreamCard card) {
-        if (card == null) {
-            return;
-        }
-        rankStreamCard(card);
-        mStreamCards.put(getStreamCardKey(card), card);
-        notifyListenersCardAdded(card);
-    }
-
-    /**
-     * Remove a {@link StreamCard} to the StreamService. All registered {@link IStreamConsumer} will
-     * be notified of the removal.
-     *
-     * @param card
-     */
-    public void removeStreamCard(StreamCard card) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Stream Card Removed: " + card.toString());
-        }
-
-        if (card == null) {
-            return;
-        }
-
-        mStreamCards.remove(getStreamCardKey(card));
-        notifyListenersCardRemoved(card);
-    }
-
-    private Pair<Integer, Long> getStreamCardKey(StreamCard card) {
-        return new Pair(card.getType(), card.getId());
-    }
-
-    private void notifyListenersCardAdded(StreamCard card) {
-        Iterator<IStreamConsumer> iterator = mConsumers.iterator();
-
-        while (iterator.hasNext()) {
-            IStreamConsumer consumer = iterator.next();
-            try {
-                consumer.onStreamCardAdded(card);
-            } catch (DeadObjectException e) {
-                iterator.remove();
-                Log.w(TAG, "Dead Stream Listener removed");
-            } catch (RemoteException e) {
-                Log.e(TAG, e.getMessage());
-            }
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Notify StreamCard added, card: " + card);
-            Log.d(TAG, "Card Extension: " + card.getCardExtension());
-        }
-    }
-
-    private void notifyListenersCardRemoved(StreamCard card) {
-        Iterator<IStreamConsumer> iterator = mConsumers.iterator();
-
-        while (iterator.hasNext()) {
-            IStreamConsumer consumer = iterator.next();
-            try {
-                consumer.onStreamCardRemoved(card);
-            } catch (DeadObjectException e) {
-                iterator.remove();
-                Log.w(TAG, "Dead Stream Listener removed");
-            } catch (RemoteException e) {
-                Log.e(TAG, e.getMessage());
-            }
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Notify StreamCard removed, card type: " + card.getType());
-        }
-    }
-
-    private void rankStreamCard(StreamCard card) {
-        // TODO: move this into a separate class once we introduce the actual ranking.
-        card.setPriority(1);
-    }
-}
diff --git a/src/com/android/car/stream/StreamServiceConstants.java b/src/com/android/car/stream/StreamServiceConstants.java
deleted file mode 100644
index 521a512..0000000
--- a/src/com/android/car/stream/StreamServiceConstants.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream;
-
-/**
- * A class that holds various common constants used through the Stream service.
- */
-public class StreamServiceConstants {
-    /**
-     * The id that should be used for all media cards. Using a common id for all media cards
-     * ensure that only one will show at a time.
-     */
-    public static long MEDIA_CARD_ID = -1L;
-
-    /**
-     * The id within the {@link MediaPlaybackExtension} that indicates this MediaPlaybackExtension
-     * is coming from a non-radio application.
-     *
-     * <p>The reason that this id is necessary is because the radio does not use the MediaSession
-     * to notify of playback state. Thus, notifications about playback state for media apps and
-     * radio are not guaranteed to be in order. This id along with {@link #MEDIA_EXTENSION_ID_RADIO}
-     * will help differentiate which application is firing a change.
-     */
-    public static long MEDIA_EXTENSION_ID_NON_RADIO = -1L;
-
-    /**
-     * The id within the {@link MediaPlaybackExtension} that indicates this MediaPlaybackExtension
-     * is coming from a radio application.
-     *
-     * @see {@link #MEDIA_EXTENSION_ID_NON_RADIO}
-     */
-    public static long MEDIA_EXTENSION_ID_RADIO= -2L;
-
-
-    private StreamServiceConstants() {}
-}
diff --git a/src/com/android/car/stream/media/MediaAppInfo.java b/src/com/android/car/stream/media/MediaAppInfo.java
deleted file mode 100644
index 34980c3..0000000
--- a/src/com/android/car/stream/media/MediaAppInfo.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.media;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ServiceInfo;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.util.Log;
-
-/**
- * An immutable class which hold the the information about the currently connected media app, if
- * it supports {@link android.service.media.MediaBrowserService}.
- */
-public class MediaAppInfo {
-    private static final String TAG = "MediaAppInfo";
-    private static final String KEY_SMALL_ICON =
-            "com.google.android.gms.car.notification.SmallIcon";
-
-    /** Third-party defined application theme to use **/
-    private static final String THEME_META_DATA_NAME
-            = "com.google.android.gms.car.application.theme";
-
-    private final ComponentName mComponentName;
-    private final Resources mPackageResources;
-    private final String mAppName;
-    private final String mPackageName;
-    private final int mSmallIcon;
-
-    private int mPrimaryColor;
-    private int mPrimaryColorDark;
-    private int mAccentColor;
-
-    public MediaAppInfo(Context context, String packageName) {
-        Resources resources = null;
-        try {
-            resources = context.getPackageManager().getResourcesForApplication(packageName);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Unable to get resources for " + packageName);
-        }
-        mPackageResources = resources;
-
-        mComponentName = MediaUtils.getMediaBrowserService(packageName, context);
-        String appName = null;
-        int smallIconResId = 0;
-        try {
-            PackageManager packageManager = context.getPackageManager();
-            ServiceInfo serviceInfo = null;
-            ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName,
-                    PackageManager.GET_META_DATA);
-
-            int labelResId;
-
-            if (mComponentName != null) {
-                serviceInfo =
-                        packageManager.getServiceInfo(mComponentName, PackageManager.GET_META_DATA);
-                smallIconResId = serviceInfo.metaData == null ? 0 : serviceInfo.metaData.getInt
-                        (KEY_SMALL_ICON, 0);
-                labelResId = serviceInfo.labelRes;
-            } else {
-                Log.w(TAG, "Service label is null for " + packageName +
-                        ". Falling back to app name.");
-                labelResId = appInfo.labelRes;
-            }
-
-            int appTheme = 0;
-            if (serviceInfo != null && serviceInfo.metaData != null) {
-                appTheme = serviceInfo.metaData.getInt(THEME_META_DATA_NAME);
-            }
-            if (appTheme == 0 && appInfo.metaData != null) {
-                appTheme = appInfo.metaData.getInt(THEME_META_DATA_NAME);
-            }
-            if (appTheme == 0) {
-                appTheme = appInfo.theme;
-            }
-
-            fetchAppColors(packageName, appTheme, context);
-            appName = (labelResId == 0 || mPackageResources == null) ? null
-                    : mPackageResources.getString(labelResId);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Got a component that doesn't exist (" + packageName + ")");
-        }
-        mSmallIcon = smallIconResId;
-        mAppName = appName;
-
-        mPackageName = packageName;
-    }
-
-    public ComponentName getComponentName() {
-        return mComponentName;
-    }
-
-    public String getAppName() {
-        return mAppName;
-    }
-
-    public int getSmallIcon() {
-        return mSmallIcon;
-    }
-
-    public String getPackageName() {
-        return mPackageName;
-    }
-
-    public Resources getPackageResources() {
-        return mPackageResources;
-    }
-
-    public int getMediaClientPrimaryColor() {
-        return mPrimaryColor;
-    }
-
-    public int getMediaClientPrimaryColorDark() {
-        return mPrimaryColorDark;
-    }
-
-    public int getMediaClientAccentColor() {
-        return mAccentColor;
-    }
-
-    private void fetchAppColors(String packageName, int appTheme, Context context) {
-        TypedArray ta = null;
-        try {
-            Context packageContext = context.createPackageContext(packageName, 0);
-            packageContext.setTheme(appTheme);
-            Resources.Theme theme = packageContext.getTheme();
-            ta = theme.obtainStyledAttributes(new int[]{
-                    android.R.attr.colorPrimary,
-                    android.R.attr.colorAccent,
-                    android.R.attr.colorPrimaryDark
-            });
-            int defaultColor =
-                    context.getColor(android.R.color.holo_green_light);
-            mPrimaryColor = ta.getColor(0, defaultColor);
-            mAccentColor = ta.getColor(1, defaultColor);
-            mPrimaryColorDark = ta.getColor(2, defaultColor);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Unable to update media client package attributes.", e);
-        } finally {
-            if (ta != null) {
-                ta.recycle();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/car/stream/media/MediaConverter.java b/src/com/android/car/stream/media/MediaConverter.java
deleted file mode 100644
index 41b9f51..0000000
--- a/src/com/android/car/stream/media/MediaConverter.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.media;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.VectorDrawable;
-import android.view.KeyEvent;
-import android.widget.RemoteViews;
-import com.android.car.stream.MediaPlaybackExtension;
-import com.android.car.stream.R;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamConstants;
-import com.android.car.stream.StreamServiceConstants;
-
-/**
- * A converter that creates a {@link StreamCard} for currently playing media.
- */
-public class MediaConverter {
-    private final PendingIntent mGotoMediaFacetAction;
-    private final PendingIntent mPauseAction;
-    private final PendingIntent mSkipToNextAction;
-    private final PendingIntent mSkipToPreviousAction;
-    private final PendingIntent mPlayAction;
-    private final PendingIntent mStopAction;
-
-    private Bitmap mPlayIcon;
-    private Bitmap mPauseIcon;
-
-    public MediaConverter(Context context) {
-        String mediaPackage = context.getString(R.string.car_media_component_package);
-        mGotoMediaFacetAction = createGoToMediaFacetIntent(context, mediaPackage);
-
-        mPauseAction = getMediaActionIntent(context,
-                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE),
-                KeyEvent.KEYCODE_MEDIA_PAUSE /* requestCode */);
-
-        mSkipToNextAction = getMediaActionIntent(context,
-                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD),
-                KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD /* requestCode */);
-
-        mSkipToPreviousAction = getMediaActionIntent(context,
-                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD),
-                KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD /* requestCode */);
-
-
-        mPlayAction = getMediaActionIntent(context,
-                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY),
-                KeyEvent.KEYCODE_MEDIA_PLAY /* requestCode */);
-
-        mStopAction = getMediaActionIntent(context,
-                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP),
-                KeyEvent.KEYCODE_MEDIA_STOP /* requestCode */);
-
-        int iconSize = context.getResources()
-                .getDimensionPixelSize(R.dimen.stream_card_secondary_icon_dimen);
-        mPlayIcon = getBitmap((VectorDrawable)
-                context.getDrawable(R.drawable.ic_play_arrow), iconSize, iconSize);
-        mPauseIcon = getBitmap((VectorDrawable)
-                context.getDrawable(R.drawable.ic_pause), iconSize, iconSize);
-    }
-
-    public StreamCard convert(
-            String title,
-            String subtitle,
-            Bitmap albumArt,
-            int appAccentColor,
-            String appName,
-            boolean canSkipToNext,
-            boolean canSkipToPrevious,
-            boolean hasPause,
-            boolean isPlaying) {
-
-        StreamCard.Builder builder = new StreamCard.Builder(StreamConstants.CARD_TYPE_MEDIA,
-                StreamConstants.MEDIA_CARD_ID, System.currentTimeMillis());
-        builder.setClickAction(mGotoMediaFacetAction);
-        builder.setPrimaryText(title);
-        builder.setSecondaryText(subtitle);
-        Bitmap icon = isPlaying ? mPlayIcon : mPauseIcon;
-        builder.setPrimaryIcon(icon);
-
-        MediaPlaybackExtension extension = new MediaPlaybackExtension(title, subtitle, albumArt,
-                appAccentColor, canSkipToNext, canSkipToPrevious, hasPause, isPlaying, appName,
-                mStopAction, mPauseAction, mPlayAction, mSkipToNextAction, mSkipToPreviousAction);
-
-        builder.setCardExtension(extension);
-        return builder.build();
-    }
-
-    /**
-     * Attaches a {@link PendingIntent} to the given {@link RemoteViews}. The PendingIntent will
-     * send the user to the CarMediaApp when touched. Note that this does not resolve to the
-     * application currently in the media card; instead, it just opens the last music app. For
-     * example, if the card is generated by Google Play Music, but the last opened music app
-     * was Spotify, then Spotify will open when the music card is tapped.
-     */
-    private PendingIntent createGoToMediaFacetIntent(Context context, String mediaPackage) {
-        Intent intent = context.getPackageManager().getLaunchIntentForPackage(mediaPackage);
-        intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
-
-        return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
-    }
-
-    private PendingIntent getMediaActionIntent(Context context, KeyEvent ke, int requestCode) {
-        Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
-        i.setPackage(context.getPackageName());
-        i.putExtra(Intent.EXTRA_KEY_EVENT, ke);
-
-        PendingIntent pendingIntent =
-                PendingIntent.getBroadcast(
-                        context,
-                        requestCode,
-                        i,
-                        PendingIntent.FLAG_CANCEL_CURRENT
-                );
-        return pendingIntent;
-    }
-
-    private static Bitmap getBitmap(VectorDrawable vectorDrawable, int width, int height) {
-        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
-        vectorDrawable.draw(canvas);
-        return bitmap;
-    }
-}
diff --git a/src/com/android/car/stream/media/MediaPlaybackMonitor.java b/src/com/android/car/stream/media/MediaPlaybackMonitor.java
deleted file mode 100644
index c360770..0000000
--- a/src/com/android/car/stream/media/MediaPlaybackMonitor.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.media;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.media.MediaDescription;
-import android.media.MediaMetadata;
-import android.media.session.PlaybackState;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.text.TextUtils;
-import android.util.Log;
-import com.android.car.apps.common.BitmapDownloader;
-import com.android.car.apps.common.BitmapWorkerOptions;
-import com.android.car.stream.R;
-
-/**
- * An service which connects to {@link MediaStateManager} for media updates (playback state and
- * metadata) and notifies listeners for these changes.
- * <p/>
- */
-public class MediaPlaybackMonitor implements MediaStateManager.Listener {
-    protected static final String TAG = "MediaPlaybackMonitor";
-
-    // MSG for metadata update handler
-    private static final int MSG_UPDATE_METADATA = 1;
-    private static final int MSG_IMAGE_DOWNLOADED = 2;
-    private static final int MSG_NEW_ALBUM_ART_RECEIVED = 3;
-
-    public interface MediaPlaybackMonitorListener {
-        void onPlaybackStateChanged(PlaybackState state);
-
-        void onMetadataChanged(String title, String text, Bitmap art, int color, String appName);
-
-        void onAlbumArtUpdated(Bitmap albumArt);
-
-        void onNewAppConnected();
-
-        void removeMediaStreamCard();
-    }
-
-    private static final String[] PREFERRED_BITMAP_ORDER = {
-            MediaMetadata.METADATA_KEY_ALBUM_ART,
-            MediaMetadata.METADATA_KEY_ART,
-            MediaMetadata.METADATA_KEY_DISPLAY_ICON
-    };
-
-    private static final String[] PREFERRED_URI_ORDER = {
-            MediaMetadata.METADATA_KEY_ALBUM_ART_URI,
-            MediaMetadata.METADATA_KEY_ART_URI,
-            MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI
-    };
-
-    private MediaMetadata mCurrentMetadata;
-    private MediaStatusUpdateHandler mMediaStatusUpdateHandler;
-    private MediaAppInfo mCurrentMediaAppInfo;
-    private MediaPlaybackMonitorListener mMonitorListener;
-
-    private Context mContext;
-
-    private final int mIconSize;
-
-    public MediaPlaybackMonitor(Context context, @NonNull MediaPlaybackMonitorListener callback) {
-        mContext = context;
-        mMonitorListener = callback;
-        mIconSize = mContext.getResources().getDimensionPixelSize(R.dimen.stream_media_icon_size);
-    }
-
-    public final void start() {
-        mMediaStatusUpdateHandler = new MediaStatusUpdateHandler();
-    }
-
-    public final void stop() {
-        if (mMediaStatusUpdateHandler != null) {
-            mMediaStatusUpdateHandler.removeCallbacksAndMessages(null);
-            mMediaStatusUpdateHandler = null;
-        }
-    }
-
-    @Override
-    public void onMediaSessionConnected(PlaybackState state, MediaMetadata metaData,
-            MediaAppInfo appInfo) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "MediaSession onConnected called");
-        }
-
-        // If the current media app is not the same as the new media app, reset
-        // the media app in MediaStreamManager
-        if (mCurrentMediaAppInfo == null
-                || !mCurrentMediaAppInfo.getPackageName().equals(appInfo.getPackageName())) {
-            mMonitorListener.onNewAppConnected();
-            if (mMediaStatusUpdateHandler != null) {
-                mMediaStatusUpdateHandler.removeCallbacksAndMessages(null);
-            }
-            mCurrentMediaAppInfo = appInfo;
-        }
-
-        if (metaData != null) {
-            onMetadataChanged(metaData);
-        }
-
-        if (state != null) {
-            onPlaybackStateChanged(state);
-        }
-    }
-
-    @Override
-    public void onPlaybackStateChanged(@Nullable PlaybackState state) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onPlaybackStateChanged called " + state.getState());
-        }
-
-        if (state == null) {
-            Log.w(TAG, "playback state is null in onPlaybackStateChanged");
-            mMonitorListener.removeMediaStreamCard();
-            return;
-        }
-
-        if (mMonitorListener != null) {
-            mMonitorListener.onPlaybackStateChanged(state);
-        }
-    }
-
-    @Override
-    public void onMetadataChanged(@Nullable MediaMetadata metadata) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onMetadataChanged called");
-        }
-        if (metadata == null) {
-            mMonitorListener.removeMediaStreamCard();
-            return;
-        }
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "received " + metadata.getDescription());
-        }
-        // Compare the new metadata and the last we have posted notification for. If both
-        // metadata and album art are the same, just ignore and return. If the album art is new,
-        // update the stream item with the new album art.
-        MediaDescription currentDescription = mCurrentMetadata == null ?
-                null : mCurrentMetadata.getDescription();
-
-        if (!MediaUtils.isSameMediaDescription(metadata.getDescription(), currentDescription)) {
-            Message msg =
-                    mMediaStatusUpdateHandler.obtainMessage(MSG_UPDATE_METADATA, metadata);
-            // Remove obsolete notifications  in the queue.
-            mMediaStatusUpdateHandler.removeMessages(MSG_UPDATE_METADATA);
-            mMediaStatusUpdateHandler.sendMessage(msg);
-        } else {
-            Bitmap newBitmap = metadata.getDescription().getIconBitmap();
-            if (newBitmap == null) {
-                return;
-            }
-            if (newBitmap.sameAs(mMediaStatusUpdateHandler.getCurrentIcon())) {
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Received duplicate metadata, ignoring...");
-                }
-            } else {
-                // same metadata, but new album art
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Received metadata with new album art");
-                }
-                Message msg = mMediaStatusUpdateHandler
-                        .obtainMessage(MSG_NEW_ALBUM_ART_RECEIVED, newBitmap);
-                mMediaStatusUpdateHandler.removeMessages(MSG_NEW_ALBUM_ART_RECEIVED);
-                mMediaStatusUpdateHandler.sendMessage(msg);
-            }
-        }
-    }
-
-    @Override
-    public void onSessionDestroyed() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Media session destroyed");
-        }
-        mMonitorListener.removeMediaStreamCard();
-    }
-
-    private class BitmapCallback extends BitmapDownloader.BitmapCallback {
-        final private int mSeq;
-
-        public BitmapCallback(int seq) {
-            mSeq = seq;
-        }
-
-        @Override
-        public void onBitmapRetrieved(Bitmap bitmap) {
-            if (mMediaStatusUpdateHandler == null) {
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "The callback comes after we finish");
-                }
-                return;
-            }
-            Message msg = mMediaStatusUpdateHandler.obtainMessage(MSG_IMAGE_DOWNLOADED,
-                    mSeq, 0, bitmap);
-            mMediaStatusUpdateHandler.sendMessage(msg);
-        }
-    }
-
-    private class MediaStatusUpdateHandler extends Handler {
-        private int mSeq = 0;
-        private BitmapCallback mCallback;
-        private MediaMetadata mMetadata;
-        private String mTitle;
-        private String mSubtitle;
-        private Bitmap mIcon;
-        private Uri mIconUri;
-        private final BitmapDownloader mDownloader = BitmapDownloader.getInstance(mContext);
-
-        private void extractMetadata(MediaMetadata metadata) {
-            if (metadata == mMetadata) {
-                // We are up to date and must return here, because we've already recycled the bitmap
-                // inside it.
-                return;
-            }
-            // keep a reference so we know which metadata we have stored.
-            mMetadata = metadata;
-            MediaDescription description = metadata.getDescription();
-            mTitle = description.getTitle() == null ? null : description.getTitle().toString();
-            mSubtitle = description.getSubtitle() == null ?
-                    null : description.getSubtitle().toString();
-            final Bitmap originalBitmap = getMetadataBitmap(metadata);
-            if (originalBitmap != null) {
-                mIcon = originalBitmap;
-            } else {
-                mIcon = null;
-            }
-            mIconUri = getMetadataIconUri(metadata);
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Album Art Uri: " + mIconUri);
-            }
-        }
-
-        private Uri getMetadataIconUri(MediaMetadata metadata) {
-            // Get the best Uri we can find
-            for (int i = 0; i < PREFERRED_URI_ORDER.length; i++) {
-                String iconUri = metadata.getString(PREFERRED_URI_ORDER[i]);
-                if (!TextUtils.isEmpty(iconUri)) {
-                    return Uri.parse(iconUri);
-                }
-            }
-            return null;
-        }
-
-        private Bitmap getMetadataBitmap(MediaMetadata metadata) {
-            // Get the best art bitmap we can find
-            for (int i = 0; i < PREFERRED_BITMAP_ORDER.length; i++) {
-                Bitmap bitmap = metadata.getBitmap(PREFERRED_BITMAP_ORDER[i]);
-                if (bitmap != null) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Retrieved bitmap type: " + PREFERRED_BITMAP_ORDER[i]
-                                + " w: " + bitmap.getWidth()
-                                + " h: " + bitmap.getHeight());
-                    }
-                    return bitmap;
-                }
-            }
-            return null;
-        }
-
-        public Bitmap getCurrentIcon() {
-            return mIcon;
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            MediaAppInfo mediaAppInfo = mCurrentMediaAppInfo;
-            int color = mediaAppInfo.getMediaClientAccentColor();
-            String appName = mediaAppInfo.getAppName();
-            switch (msg.what) {
-                case MSG_UPDATE_METADATA:
-                    mSeq++;
-                    MediaMetadata metadata = (MediaMetadata) msg.obj;
-                    if (metadata == null) {
-                        Log.w(TAG, "media metadata is null!");
-                        return;
-                    }
-                    extractMetadata(metadata);
-                    if (mCallback != null) {
-                        // it's ok to cancel a callback that has already been called, the downloader
-                        // will just ignore the operation.
-                        mDownloader.cancelDownload(mCallback);
-                        mCallback = null;
-                    }
-                    if (mIcon != null) {
-                        mMonitorListener.onMetadataChanged(mTitle, mSubtitle, mIcon,
-                                color, appName);
-                    } else if (mIconUri != null) {
-                        mCallback = new BitmapCallback(mSeq);
-                        mDownloader.getBitmap(
-                                new BitmapWorkerOptions.Builder(mContext)
-                                        .resource(mIconUri).width(mIconSize)
-                                        .height(mIconSize).build(), mCallback);
-                    } else {
-                        mMonitorListener.onMetadataChanged(mTitle, mSubtitle, mIcon,
-                                color, appName);
-                    }
-                    // Only set mCurrentMetadata after we have updated the listener (if the
-                    // bitmap is downloaded asynchronously, that is fine too. The stream card will
-                    // be posted, when image is downloaded.)
-                    mCurrentMetadata = metadata;
-                    break;
-
-                case MSG_IMAGE_DOWNLOADED:
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Image downloaded...");
-                    }
-                    int seq = msg.arg1;
-                    Bitmap bitmap = (Bitmap) msg.obj;
-                    if (seq == mSeq) {
-                        mMonitorListener.onMetadataChanged(mTitle, mSubtitle, bitmap, color, appName);
-                    }
-                    break;
-
-                case MSG_NEW_ALBUM_ART_RECEIVED:
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Received a new album art...");
-                    }
-                    Bitmap newAlbumArt = (Bitmap) msg.obj;
-                    mMonitorListener.onAlbumArtUpdated(newAlbumArt);
-                    break;
-                default:
-            }
-        }
-    }
-}
diff --git a/src/com/android/car/stream/media/MediaStateManager.java b/src/com/android/car/stream/media/MediaStateManager.java
deleted file mode 100644
index e574852..0000000
--- a/src/com/android/car/stream/media/MediaStateManager.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.media;
-
-import android.content.Context;
-import android.media.MediaMetadata;
-import android.media.session.MediaController;
-import android.media.session.MediaSessionManager;
-import android.media.session.PlaybackState;
-import android.os.Handler;
-import android.os.Looper;
-import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.util.Log;
-import android.view.KeyEvent;
-import com.android.car.apps.common.util.Assert;
-
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A class to listen for changes in sessions from {@link MediaSessionManager}. It also notifies
- * listeners of changes in the playback state or metadata.
- */
-public class MediaStateManager {
-    private static final String TAG = "MediaStateManager";
-    private static final String TELECOM_PACKAGE = "com.android.server.telecom";
-
-    private final Context mContext;
-
-    private MediaAppInfo mConnectedAppInfo;
-    private MediaController mController;
-    private Handler mHandler;
-    private final Set<Listener> mListeners;
-
-    public interface Listener {
-        void onMediaSessionConnected(PlaybackState playbackState, MediaMetadata metaData,
-                MediaAppInfo appInfo);
-
-        void onPlaybackStateChanged(@Nullable PlaybackState state);
-
-        void onMetadataChanged(@Nullable MediaMetadata metadata);
-
-        void onSessionDestroyed();
-    }
-
-    public MediaStateManager(@NonNull Context context) {
-        mContext = context;
-        mHandler = new Handler(Looper.getMainLooper());
-        mListeners = new LinkedHashSet<>();
-    }
-
-    public void start() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Starting MediaStateManager");
-        }
-        MediaSessionManager sessionManager
-                = (MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
-
-        try {
-            sessionManager.addOnActiveSessionsChangedListener(mSessionChangedListener, null);
-
-            List<MediaController> controllers = sessionManager.getActiveSessions(null);
-            updateMediaController(controllers);
-        } catch (SecurityException e) {
-            // User hasn't granted the permission so we should just go away silently.
-        }
-    }
-
-    @MainThread
-    public void destroy() {
-        Assert.isMainThread();
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "destroy()");
-        }
-        stop();
-        mListeners.clear();
-        mHandler = null;
-    }
-
-    @MainThread
-    public void stop() {
-        Assert.isMainThread();
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "stop()");
-        }
-
-        if (mController != null) {
-            mController.unregisterCallback(mMediaControllerCallback);
-            mController = null;
-        }
-        // Calling this with null will clear queue of callbacks and message. This needs to be done
-        // here because prior to the above lines to disconnect and unregister the
-        // controller a posted runnable to do work maybe have happened and thus we need to clear it
-        // out to prevent race conditions.
-        mHandler.removeCallbacksAndMessages(null);
-    }
-
-    public void dispatchMediaButton(KeyEvent keyEvent) {
-        if (mController != null) {
-            MediaController.TransportControls transportControls
-                    = mController.getTransportControls();
-            int eventId = keyEvent.getKeyCode();
-
-            switch (eventId) {
-                case KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD:
-                    transportControls.skipToPrevious();
-                    break;
-                case KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD:
-                    transportControls.skipToNext();
-                    break;
-                case KeyEvent.KEYCODE_MEDIA_PLAY:
-                    transportControls.play();
-                    break;
-                case KeyEvent.KEYCODE_MEDIA_PAUSE:
-                    transportControls.pause();
-                    break;
-                case KeyEvent.KEYCODE_MEDIA_STOP:
-                    transportControls.stop();
-                    break;
-                default:
-                    mController.dispatchMediaButtonEvent(keyEvent);
-            }
-        }
-    }
-
-    public void addListener(@NonNull Listener listener) {
-        mListeners.add(listener);
-    }
-
-    public void removeListener(@NonNull Listener listener) {
-        mListeners.remove(listener);
-    }
-
-    private void updateMediaController(List<MediaController> controllers) {
-        if (controllers.size() > 0) {
-            // If the telecom package is trying to onStart a media session, ignore it
-            // so that the existing media item continues to appear in the stream.
-            if (TELECOM_PACKAGE.equals(controllers.get(0).getPackageName())) {
-                return;
-            }
-
-            if (mController != null) {
-                mController.unregisterCallback(mMediaControllerCallback);
-            }
-            // Currently the first controller is the active one playing music.
-            // If this is no longer the case, consider checking notification listener
-            // for a MediaStyle notification to get currently playing media app.
-            mController = controllers.get(0);
-            mController.registerCallback(mMediaControllerCallback);
-
-            mConnectedAppInfo = new MediaAppInfo(mContext, mController.getPackageName());
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "updating media controller");
-            }
-
-            for (Listener listener : mListeners) {
-                listener.onMediaSessionConnected(mController.getPlaybackState(),
-                        mController.getMetadata(), mConnectedAppInfo);
-            }
-        } else {
-            Log.w(TAG, "Updating controllers with an empty list!");
-        }
-    }
-
-    public static boolean isMainThread() {
-        return Looper.myLooper() == Looper.getMainLooper();
-    }
-
-    private final MediaSessionManager.OnActiveSessionsChangedListener
-            mSessionChangedListener = new MediaSessionManager.OnActiveSessionsChangedListener() {
-        @Override
-        public void onActiveSessionsChanged(List<MediaController> controllers) {
-            updateMediaController(controllers);
-        }
-    };
-
-    private final MediaController.Callback mMediaControllerCallback =
-            new MediaController.Callback() {
-                @Override
-                public void onPlaybackStateChanged(@NonNull final PlaybackState state) {
-                    mHandler.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                                Log.d(TAG, "onPlaybackStateChanged(" + state + ")");
-                            }
-                            for (Listener listener : mListeners) {
-                                listener.onPlaybackStateChanged(state);
-                            }
-                        }
-                    });
-                }
-
-                @Override
-                public void onMetadataChanged(@Nullable final MediaMetadata metadata) {
-                    mHandler.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                                Log.d(TAG, "onMetadataChanged(" + metadata + ")");
-                            }
-                            for (Listener listener : mListeners) {
-                                listener.onMetadataChanged(metadata);
-                            }
-                        }
-                    });
-                }
-
-                @Override
-                public void onSessionDestroyed() {
-                    mHandler.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                                Log.d(TAG, "onSessionDestroyed()");
-                            }
-
-                            mConnectedAppInfo = null;
-                            if (mController != null) {
-                                mController.unregisterCallback(mMediaControllerCallback);
-                                mController = null;
-                            }
-
-                            for (Listener listener : mListeners) {
-                                listener.onSessionDestroyed();
-                            }
-                        }
-                    });
-                }
-            };
-}
diff --git a/src/com/android/car/stream/media/MediaStreamProducer.java b/src/com/android/car/stream/media/MediaStreamProducer.java
deleted file mode 100644
index 8808f14..0000000
--- a/src/com/android/car/stream/media/MediaStreamProducer.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.media;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Bitmap;
-import android.media.session.PlaybackState;
-import android.util.Log;
-import android.view.KeyEvent;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamProducer;
-
-/**
- * Produces {@link StreamCard} on media playback or metadata changes.
- */
-public class MediaStreamProducer extends StreamProducer
-        implements MediaPlaybackMonitor.MediaPlaybackMonitorListener {
-    private static final String TAG = "MediaStreamProducer";
-
-    private MediaPlaybackMonitor mPlaybackMonitor;
-    private MediaStateManager mMediaStateManager;
-    private MediaKeyReceiver mMediaKeyReceiver;
-    private MediaConverter mConverter;
-
-    private StreamCard mCurrentMediaStreamCard;
-
-    private boolean mHasReceivedPlaybackState;
-    private boolean mHasReceivedMetadata;
-
-    // Current playback state of the media session.
-    private boolean mIsPlaying;
-    private boolean mHasPause;
-    private boolean mCanSkipToNext;
-    private boolean mCanSkipToPrevious;
-
-    private String mTitle;
-    private String mSubtitle;
-    private Bitmap mAlbumArt;
-    private int mAppAccentColor;
-    private String mAppName;
-
-    public MediaStreamProducer(Context context) {
-        super(context);
-        mConverter = new MediaConverter(context);
-    }
-
-    @Override
-    public void start() {
-        super.start();
-        mPlaybackMonitor = new MediaPlaybackMonitor(mContext,
-                MediaStreamProducer.this /* MediaPlaybackMonitorListener */);
-        mPlaybackMonitor.start();
-
-        mMediaKeyReceiver = new MediaKeyReceiver();
-        mContext.registerReceiver(mMediaKeyReceiver,
-                new IntentFilter(Intent.ACTION_MEDIA_BUTTON));
-
-        mMediaStateManager = new MediaStateManager(mContext);
-        mMediaStateManager.addListener(mPlaybackMonitor);
-        mMediaStateManager.start();
-    }
-
-    @Override
-    public void stop() {
-        mPlaybackMonitor.stop();
-        mMediaStateManager.destroy();
-
-        mPlaybackMonitor = null;
-        mMediaStateManager = null;
-
-        mContext.unregisterReceiver(mMediaKeyReceiver);
-        mMediaKeyReceiver = null;
-        super.stop();
-    }
-
-    private class MediaKeyReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String intentAction = intent.getAction();
-            if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
-                KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
-                if (event == null) {
-                    return;
-                }
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Received media key " + event.getKeyCode());
-                }
-                mMediaStateManager.dispatchMediaButton(event);
-            }
-        }
-    }
-
-    public void onPlaybackStateChanged(PlaybackState state) {
-        //Some media apps tend to spam playback state changes. Check if the playback state changes
-        // are relevant. If it is the same, don't bother updating and posting to the stream.
-        if (isDuplicatePlaybackState(state)) {
-            return;
-        }
-
-        int playbackState = state.getState();
-        mHasPause = ((state.getActions() & PlaybackState.ACTION_PAUSE) != 0);
-        if (!mHasPause) {
-            mHasPause = ((state.getActions() & PlaybackState.ACTION_PLAY_PAUSE) != 0);
-        }
-        mCanSkipToNext = ((state.getActions() & PlaybackState.ACTION_SKIP_TO_NEXT) != 0);
-        mCanSkipToPrevious = ((state.getActions() & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0);
-        if (playbackState == PlaybackState.STATE_PLAYING
-                || playbackState == PlaybackState.STATE_BUFFERING) {
-            mIsPlaying = true;
-        }  else {
-            mIsPlaying = false;
-        }
-        mHasReceivedPlaybackState = true;
-        maybeUpdateStreamCard();
-    }
-
-    private void maybeUpdateStreamCard() {
-        if (mHasReceivedPlaybackState && mHasReceivedMetadata) {
-            mCurrentMediaStreamCard = mConverter.convert(mTitle, mSubtitle, mAlbumArt,
-                    mAppAccentColor, mAppName, mCanSkipToNext, mCanSkipToPrevious,
-                    mHasPause, mIsPlaying);
-            if (mCurrentMediaStreamCard == null) {
-                Log.w(TAG, "Media Card was not created");
-                return;
-            }
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Media Card posted");
-            }
-            postCard(mCurrentMediaStreamCard);
-        }
-    }
-
-    public void onMetadataChanged(String title, String subtitle, Bitmap albumArt, int color,
-            String appName) {
-        //Some media apps tend to spam metadata state changes. Check if the playback state changes
-        // are relevant. If it is the same, don't bother updating and posting to the stream.
-        if (isSameString(title, mTitle)
-                && isSameString(subtitle, mSubtitle)
-                && isSameBitmap(albumArt, albumArt)
-                && color == mAppAccentColor
-                && isSameString(appName, mAppName)) {
-            return;
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Update notification.");
-        }
-
-        mTitle = title;
-        mSubtitle = subtitle;
-        mAlbumArt = albumArt;
-        mAppAccentColor = color;
-        mAppName = appName;
-
-        mHasReceivedMetadata = true;
-        maybeUpdateStreamCard();
-    }
-
-    private boolean isDuplicatePlaybackState(PlaybackState state) {
-        if (!mHasReceivedPlaybackState) {
-            return false;
-        }
-        int playbackState = state.getState();
-
-        boolean hasPause
-                = ((state.getActions() & PlaybackState.ACTION_PAUSE) != 0);
-        boolean canSkipToNext
-                = ((state.getActions() & PlaybackState.ACTION_SKIP_TO_NEXT) != 0);
-        boolean canSkipToPrevious
-                = ((state.getActions() & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0);
-
-        boolean isPlaying = playbackState == PlaybackState.STATE_PLAYING
-                || playbackState == PlaybackState.STATE_BUFFERING;
-
-        return (hasPause == mHasPause
-                && canSkipToNext == mCanSkipToNext
-                && canSkipToPrevious == mCanSkipToPrevious
-                && isPlaying == mIsPlaying);
-    }
-
-    @Override
-    public void onAlbumArtUpdated(Bitmap albumArt) {
-        mAlbumArt = albumArt;
-        maybeUpdateStreamCard();
-    }
-
-    @Override
-    public void onNewAppConnected() {
-        mHasReceivedMetadata = false;
-        mHasReceivedPlaybackState = false;
-        removeCard(mCurrentMediaStreamCard);
-        mCurrentMediaStreamCard = null;
-
-        // clear out all existing values
-        mTitle = null;
-        mSubtitle = null;
-        mAlbumArt = null;
-        mAppName = null;
-        mAppAccentColor = 0;
-        mCanSkipToNext = false;
-        mCanSkipToPrevious = false;
-        mHasPause = false;
-        mIsPlaying = false;
-        mIsPlaying = false;
-    }
-
-    @Override
-    public void removeMediaStreamCard() {
-        removeCard(mCurrentMediaStreamCard);
-        mCurrentMediaStreamCard = null;
-    }
-
-    private boolean isSameBitmap(Bitmap bmp1, Bitmap bmp2) {
-        return bmp1 == null
-                ? bmp2 == null : (bmp1 == bmp2 && bmp1.getGenerationId() == bmp2.getGenerationId());
-    }
-
-    private boolean isSameString(CharSequence str1, CharSequence str2) {
-        return str1 == null ? str2 == null : str1.equals(str2);
-    }
-}
diff --git a/src/com/android/car/stream/media/MediaUtils.java b/src/com/android/car/stream/media/MediaUtils.java
deleted file mode 100644
index b271b2b..0000000
--- a/src/com/android/car/stream/media/MediaUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.media;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.media.MediaDescription;
-import android.service.media.MediaBrowserService;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Media related utility functions
- */
-public final class MediaUtils {
-    /**
-     * @return True if the two media descriptions are the same.
-     */
-    public static boolean isSameMediaDescription(MediaDescription description1,
-            MediaDescription description2) {
-        if ((description1 == null) && (description2 == null)) {
-            return true;
-        }
-
-        if (description1 != null && description2 != null) {
-            return Objects.equals(description1.getTitle(), description2.getTitle())
-                    && Objects.equals(description1.getSubtitle(), description2.getSubtitle());
-        }
-        return false;
-    }
-
-    /**
-     * @return The component name of the {@link MediaBrowserService} for the given package name.
-     */
-    public static ComponentName getMediaBrowserService(String packageName,
-            Context context) {
-        Intent intent = new Intent(MediaBrowserService.SERVICE_INTERFACE);
-        List<ResolveInfo> mediaApps = context.getPackageManager()
-                .queryIntentServices(intent, PackageManager.GET_RESOLVED_FILTER);
-
-        for (int i = 0; i < mediaApps.size(); i++) {
-            ResolveInfo info = mediaApps.get(i);
-            if (packageName.equals(info.serviceInfo.packageName)) {
-                return new ComponentName(packageName, info.serviceInfo.name /* className */);
-            }
-        }
-        return null;
-    }
-}
diff --git a/src/com/android/car/stream/notifications/StreamNotificationListenerService.java b/src/com/android/car/stream/notifications/StreamNotificationListenerService.java
deleted file mode 100644
index 6e0c39b..0000000
--- a/src/com/android/car/stream/notifications/StreamNotificationListenerService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.notifications;
-
-import android.service.notification.NotificationListenerService;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-/**
- * A listener to intercept notifications for the stream.
- */
-public class StreamNotificationListenerService extends NotificationListenerService {
-    private static final String TAG = "NotificationListener";
-
-    @Override
-    public void onNotificationPosted(StatusBarNotification sbn) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Notification received");
-        }
-    }
-
-    @Override
-    public void onNotificationRemoved(StatusBarNotification sbn) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Notification removed");
-        }
-    }
-}
diff --git a/src/com/android/car/stream/radio/RadioConverter.java b/src/com/android/car/stream/radio/RadioConverter.java
deleted file mode 100644
index f3ef426..0000000
--- a/src/com/android/car/stream/radio/RadioConverter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.radio;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.VectorDrawable;
-import android.support.annotation.ColorInt;
-import com.android.car.radio.service.RadioStation;
-import com.android.car.stream.MediaPlaybackExtension;
-import com.android.car.stream.R;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamConstants;
-import com.android.car.stream.StreamServiceConstants;
-
-/**
- * A converter that is responsible for transforming a {@link RadioStation} into a
- * {@link StreamCard}.
- */
-public class RadioConverter {
-    /**
-     * The separator between the radio channel and band (e.g. between 99.7 and FM).
-     */
-    private static final String CHANNEL_AND_BAND_SEPARATOR = " ";
-
-    private final Context mContext;
-
-    private final PendingIntent mGoToRadioAction;
-    private final PendingIntent mPauseAction;
-    private final PendingIntent mForwardSeekAction;
-    private final PendingIntent mBackwardSeekAction;
-    private final PendingIntent mPlayAction;
-    private final PendingIntent mStopAction;
-
-    @ColorInt
-    private final int mAccentColor;
-
-    private final Bitmap mPlayIcon;
-    private final Bitmap mPauseIcon;
-
-    public RadioConverter(Context context) {
-        mContext = context;
-
-        mGoToRadioAction = createGoToRadioIntent();
-        mPauseAction = createRadioActionIntent(RadioStreamProducer.ACTION_PAUSE);
-        mPlayAction = createRadioActionIntent(RadioStreamProducer.ACTION_PLAY);
-        mStopAction = createRadioActionIntent(RadioStreamProducer.ACTION_STOP);
-        mForwardSeekAction = createRadioActionIntent(RadioStreamProducer.ACTION_SEEK_FORWARD);
-        mBackwardSeekAction = createRadioActionIntent(RadioStreamProducer.ACTION_SEEK_BACKWARD);
-
-        mAccentColor = mContext.getColor(R.color.car_radio_accent_color);
-
-        int iconSize = context.getResources()
-                .getDimensionPixelSize(R.dimen.stream_card_secondary_icon_dimen);
-        mPlayIcon = getBitmap((VectorDrawable)
-                mContext.getDrawable(R.drawable.ic_play_arrow), iconSize, iconSize);
-        mPauseIcon = getBitmap((VectorDrawable)
-                mContext.getDrawable(R.drawable.ic_pause), iconSize, iconSize);
-    }
-
-    /**
-     * Converts the given {@link RadioStation} and play status into a {@link StreamCard} that can
-     * be used to display a radio card.
-     */
-    public StreamCard convert(RadioStation station, boolean isPlaying) {
-        StreamCard.Builder builder = new StreamCard.Builder(StreamConstants.CARD_TYPE_MEDIA,
-                StreamConstants.RADIO_CARD_ID, System.currentTimeMillis());
-
-        builder.setClickAction(mGoToRadioAction);
-
-        String title = createTitleText(station);
-        builder.setPrimaryText(title);
-
-        String subtitle = null;
-        if (station.getRds() != null) {
-            subtitle = station.getRds().getProgramService();
-            builder.setSecondaryText(subtitle);
-        }
-
-        Bitmap icon = isPlaying ? mPlayIcon : mPauseIcon;
-        builder.setPrimaryIcon(icon);
-
-        MediaPlaybackExtension extension = new MediaPlaybackExtension(title, subtitle,
-                null /* albumArt */, mAccentColor, true /* canSkipToNext */,
-                true /* canSkipToPrevious */, true /* hasPause */, isPlaying,
-                mContext.getString(R.string.radio_app_name), mStopAction, mPauseAction, mPlayAction,
-                mForwardSeekAction, mBackwardSeekAction);
-
-        builder.setCardExtension(extension);
-        return builder.build();
-    }
-
-    /**
-     * Returns the String that represents the title text of the radio card. The title should be
-     * a combination of the current channel number and radio band.
-     */
-    private String createTitleText(RadioStation station) {
-        int radioBand = station.getRadioBand();
-        String channel = RadioFormatter.formatRadioChannel(radioBand,
-                station.getChannelNumber());
-        String band = RadioFormatter.formatRadioBand(mContext, radioBand);
-
-        return channel + CHANNEL_AND_BAND_SEPARATOR + band;
-    }
-
-    /**
-     * Returns an {@link Intent} that will take the user to the radio application.
-     */
-    private PendingIntent createGoToRadioIntent() {
-        ComponentName radioComponent = new ComponentName(
-                mContext.getString(R.string.car_radio_component_package),
-                mContext.getString(R.string.car_radio_component_activity));
-
-        Intent intent = new Intent();
-        intent.setComponent(radioComponent);
-        intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
-
-        return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
-    }
-
-    /**
-     * Returns an {@link Intent} that will perform the given action.
-     *
-     * @param action One of the action values in {@link RadioStreamProducer}. e.g.
-     *               {@link RadioStreamProducer#ACTION_PAUSE}.
-     */
-    private PendingIntent createRadioActionIntent(int action) {
-        Intent intent = new Intent(RadioStreamProducer.RADIO_INTENT_ACTION);
-        intent.setPackage(mContext.getPackageName());
-        intent.putExtra(RadioStreamProducer.RADIO_ACTION_EXTRA, action);
-
-        return PendingIntent.getBroadcast(mContext, action /* requestCode */,
-                intent, PendingIntent.FLAG_CANCEL_CURRENT);
-    }
-
-    /**
-     * Returns a {@link Bitmap} that corresponds to the given {@link VectorDrawable}.
-     */
-    private static Bitmap getBitmap(VectorDrawable vectorDrawable, int width, int height) {
-        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
-        vectorDrawable.draw(canvas);
-        return bitmap;
-    }
-}
diff --git a/src/com/android/car/stream/radio/RadioFormatter.java b/src/com/android/car/stream/radio/RadioFormatter.java
deleted file mode 100644
index ad427d2..0000000
--- a/src/com/android/car/stream/radio/RadioFormatter.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.radio;
-
-import android.content.Context;
-import android.hardware.radio.RadioManager;
-import com.android.car.radio.service.RadioStation;
-import com.android.car.stream.R;
-
-import java.text.DecimalFormat;
-import java.util.Locale;
-/**
- * Common formatters for displaying channel numbers for various radio channels and bands.
- */
-public final class RadioFormatter {
-    private static final String FM_CHANNEL_FORMAT = "###.#";
-    private static final String AM_CHANNEL_FORMAT = "####";
-
-    private RadioFormatter() {}
-
-    /**
-     * The formatter for AM radio stations.
-     */
-    public static final DecimalFormat FM_FORMATTER = new DecimalFormat(FM_CHANNEL_FORMAT);
-
-    /**
-     * The formatter for FM radio stations.
-     */
-    public static final DecimalFormat AM_FORMATTER = new DecimalFormat(AM_CHANNEL_FORMAT);
-
-    /**
-     * Convenience method to format a given {@link RadioStation} based on the value in
-     * {@link RadioStation#getRadioBand()}. If the band is invalid or support for its formatting is
-     * not available, then an empty String is returned.
-     *
-     * @param band One of the band values specified in {@link RadioManager}. For example,
-     *             {@link RadioManager#BAND_FM}.
-     * @param channelNumber The channel number to format. This value should be in KHz.
-     * @return A correctly formatted channel number or an empty string if one cannot be formed.
-     */
-    public static String formatRadioChannel(int band, int channelNumber) {
-        switch (band) {
-            case RadioManager.BAND_AM:
-                return AM_FORMATTER.format(channelNumber);
-
-            case RadioManager.BAND_FM:
-                // FM channels are displayed in KHz, so divide by 1000.
-                return FM_FORMATTER.format((float) channelNumber / 1000);
-
-            default:
-                return "";
-        }
-    }
-
-    /**
-     * Formats the given band value into a readable String.
-     *
-     * @param band One of the band values specified in {@link RadioManager}. For example,
-     *             {@link RadioManager#BAND_FM}.
-     * @return The formatted string or an empty string if the band is invalid.
-     */
-    public static String formatRadioBand(Context context, int band) {
-        String radioBandText;
-
-        switch (band) {
-            case RadioManager.BAND_AM:
-                radioBandText = context.getString(R.string.radio_am_text);
-                break;
-
-            case RadioManager.BAND_FM:
-                radioBandText = context.getString(R.string.radio_fm_text);
-                break;
-
-            default:
-                radioBandText = "";
-        }
-
-        return radioBandText.toUpperCase(Locale.getDefault());
-    }
-}
diff --git a/src/com/android/car/stream/radio/RadioStreamProducer.java b/src/com/android/car/stream/radio/RadioStreamProducer.java
deleted file mode 100644
index 4c36650..0000000
--- a/src/com/android/car/stream/radio/RadioStreamProducer.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.radio;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-import com.android.car.radio.service.IRadioCallback;
-import com.android.car.radio.service.IRadioManager;
-import com.android.car.radio.service.RadioRds;
-import com.android.car.radio.service.RadioStation;
-import com.android.car.stream.R;
-import com.android.car.stream.StreamProducer;
-
-/**
- * A {@link StreamProducer} that will connect to the {@link IRadioManager} and produce cards
- * corresponding to the currently playing radio station.
- */
-public class RadioStreamProducer extends StreamProducer {
-    private static final String TAG = "RadioStreamProducer";
-
-    /**
-     * The amount of time to wait before re-trying to connect to {@link IRadioManager}.
-     */
-    private static final int SERVICE_CONNECTION_RETRY_DELAY_MS = 5000;
-
-    // Radio actions that are used by broadcasts that occur on interaction with the radio card.
-    static final int ACTION_SEEK_FORWARD = 1;
-    static final int ACTION_SEEK_BACKWARD = 2;
-    static final int ACTION_PAUSE = 3;
-    static final int ACTION_PLAY = 4;
-    static final int ACTION_STOP = 5;
-
-    /**
-     * The action in an {@link Intent} that is meant to effect certain radio actions.
-     */
-    static final String RADIO_INTENT_ACTION =
-            "com.android.car.stream.radio.RADIO_INTENT_ACTION";
-
-    /**
-     * The extra within the {@link Intent} that points to the specific action to be taken on the
-     * radio.
-     */
-    static final String RADIO_ACTION_EXTRA = "radio_action_extra";
-
-    private final Handler mHandler = new Handler();
-
-    private IRadioManager mRadioManager;
-    private RadioActionReceiver mReceiver;
-    private final RadioConverter mConverter;
-
-    /**
-     * The number of times that this stream producer has attempted to reconnect to the
-     * {@link IRadioManager} after a failure to bind.
-     */
-    private int mConnectionRetryCount;
-
-    private int mCurrentChannelNumber;
-    private int mCurrentBand;
-
-    public RadioStreamProducer(Context context) {
-        super(context);
-        mConverter = new RadioConverter(context);
-    }
-
-    @Override
-    public void start() {
-        super.start();
-
-        mReceiver = new RadioActionReceiver();
-        mContext.registerReceiver(mReceiver, new IntentFilter(RADIO_INTENT_ACTION));
-
-        bindRadioService();
-    }
-
-    @Override
-    public void stop() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "stop()");
-        }
-
-        mHandler.removeCallbacks(mServiceConnectionRetry);
-
-        mContext.unregisterReceiver(mReceiver);
-        mReceiver = null;
-
-        mContext.unbindService(mServiceConnection);
-        super.stop();
-    }
-
-    /**
-     * Binds to the RadioService and returns {@code true} if the connection was successful.
-     */
-    private boolean bindRadioService() {
-        Intent radioService = new Intent();
-        radioService.setComponent(new ComponentName(
-                mContext.getString(R.string.car_radio_component_package),
-                mContext.getString(R.string.car_radio_component_service)));
-
-        boolean bound =
-                !mContext.bindService(radioService, mServiceConnection, Context.BIND_AUTO_CREATE);
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "bindRadioService(). Connected to radio service: " + bound);
-        }
-
-        return bound;
-    }
-
-    /**
-     * A {@link BroadcastReceiver} that listens for Intents that have the action
-     * {@link #RADIO_INTENT_ACTION} and corresponding parses the action event within it to effect
-     * radio playback.
-     */
-    private class RadioActionReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (mRadioManager == null || !RADIO_INTENT_ACTION.equals(intent.getAction())) {
-                return;
-            }
-
-            int radioAction = intent.getIntExtra(RADIO_ACTION_EXTRA, -1);
-            if (radioAction == -1) {
-                return;
-            }
-
-            switch (radioAction) {
-                case ACTION_SEEK_FORWARD:
-                    try {
-                        mRadioManager.seekForward();
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Seek forward exception: " + e.getMessage());
-                    }
-                    break;
-
-                case ACTION_SEEK_BACKWARD:
-                    try {
-                        mRadioManager.seekBackward();
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Seek backward exception: " + e.getMessage());
-                    }
-                    break;
-
-                case ACTION_PLAY:
-                    try {
-                        mRadioManager.unMute();
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Radio play exception: " + e.getMessage());
-                    }
-                    break;
-
-                case ACTION_STOP:
-                case ACTION_PAUSE:
-                    try {
-                        mRadioManager.mute();
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Radio pause exception: " + e.getMessage());
-                    }
-                    break;
-
-                default:
-                    // Do nothing.
-            }
-        }
-    }
-
-    /**
-     * A {@link IRadioCallback} that will be notified of various state changes in the radio station.
-     * Upon these changes, it will push a new {@link com.android.car.stream.StreamCard} to the
-     * Stream service.
-     */
-    private final IRadioCallback.Stub mCallback = new IRadioCallback.Stub() {
-        @Override
-        public void onRadioStationChanged(RadioStation station) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onRadioStationChanged: " + station);
-            }
-
-            mCurrentBand = station.getRadioBand();
-            mCurrentChannelNumber = station.getChannelNumber();
-
-            if (mRadioManager == null) {
-                return;
-            }
-
-            try {
-                boolean isPlaying = !mRadioManager.isMuted();
-                postCard(mConverter.convert(station, isPlaying));
-            } catch (RemoteException e) {
-                Log.e(TAG, "Post radio station changed error: " + e.getMessage());
-            }
-        }
-
-        @Override
-        public void onRadioMetadataChanged(RadioRds rds) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onRadioMetadataChanged: " + rds);
-            }
-
-            // Ignore metadata changes because this will overwhelm the notifications. Instead,
-            // Only display the metadata that is retrieved in onRadioStationChanged().
-        }
-
-        @Override
-        public void onRadioBandChanged(int radioBand) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onRadioBandChanged: " + radioBand);
-            }
-
-            if (mRadioManager == null) {
-                return;
-            }
-
-            try {
-                RadioStation station = new RadioStation(mCurrentChannelNumber,
-                        0 /* subChannelNumber */, mCurrentBand, null /* rds */);
-                boolean isPlaying = !mRadioManager.isMuted();
-
-                postCard(mConverter.convert(station, isPlaying));
-            } catch (RemoteException e) {
-                Log.e(TAG, "Post radio station changed error: " + e.getMessage());
-            }
-        }
-
-        @Override
-        public void onRadioMuteChanged(boolean isMuted) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onRadioMuteChanged(): " + isMuted);
-            }
-
-            RadioStation station = new RadioStation(mCurrentChannelNumber,
-                    0 /* subChannelNumber */, mCurrentBand, null /* rds */);
-
-            postCard(mConverter.convert(station, !isMuted));
-        }
-
-        @Override
-        public void onError(int status) {
-            Log.e(TAG, "Radio error: " + status);
-        }
-    };
-
-    private ServiceConnection mServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder binder) {
-            mConnectionRetryCount = 0;
-
-            mRadioManager = IRadioManager.Stub.asInterface(binder);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onSeviceConnected(): " + mRadioManager);
-            }
-
-            try {
-                mRadioManager.addRadioTunerCallback(mCallback);
-
-                if (mRadioManager.isInitialized() && mRadioManager.hasFocus()) {
-                    boolean isPlaying = !mRadioManager.isMuted();
-                    postCard(mConverter.convert(mRadioManager.getCurrentRadioStation(), isPlaying));
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, "addRadioTunerCallback() error: " + e.getMessage());
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onServiceDisconnected(): " + name);
-            }
-            mRadioManager = null;
-
-            // If the service has been disconnected, attempt to reconnect.
-            mHandler.removeCallbacks(mServiceConnectionRetry);
-            mHandler.postDelayed(mServiceConnectionRetry, SERVICE_CONNECTION_RETRY_DELAY_MS);
-        }
-    };
-
-    /**
-     * A {@link Runnable} that is responsible for attempting to reconnect to {@link IRadioManager}.
-     */
-    private Runnable mServiceConnectionRetry = new Runnable() {
-        @Override
-        public void run() {
-            if (mRadioManager != null) {
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "RadioService rebound by framework, no need to bind again");
-                }
-                return;
-            }
-
-            mConnectionRetryCount++;
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Rebinding disconnected RadioService, retry count: "
-                        + mConnectionRetryCount);
-            }
-
-            if (!bindRadioService()) {
-                mHandler.postDelayed(mServiceConnectionRetry,
-                        mConnectionRetryCount * SERVICE_CONNECTION_RETRY_DELAY_MS);
-            }
-        }
-    };
-}
diff --git a/src/com/android/car/stream/telecom/CurrentCallConverter.java b/src/com/android/car/stream/telecom/CurrentCallConverter.java
deleted file mode 100644
index 8c29919..0000000
--- a/src/com/android/car/stream/telecom/CurrentCallConverter.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.drawable.VectorDrawable;
-import android.telecom.Call;
-import com.android.car.stream.BitmapUtils;
-import com.android.car.stream.CurrentCallExtension;
-import com.android.car.stream.R;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamConstants;
-
-/**
- * A converter that creates a {@link StreamCard} for the current call events.
- */
-public class CurrentCallConverter {
-    private static final int MUTE_BUTTON_REQUEST_CODE = 12;
-    private static final int CALL_BUTTON_REQUEST_CODE = 13;
-
-    private PendingIntent mMuteAction;
-    private PendingIntent mUnMuteAction;
-    private PendingIntent mAcceptCallAction;
-    private PendingIntent mHangupCallAction;
-
-    public CurrentCallConverter(Context context) {
-        mMuteAction =  getCurrentCallAction(context,
-                TelecomConstants.ACTION_MUTE, MUTE_BUTTON_REQUEST_CODE);
-        mUnMuteAction =  getCurrentCallAction(context,
-                TelecomConstants.ACTION_MUTE, MUTE_BUTTON_REQUEST_CODE);
-
-        mAcceptCallAction =  getCurrentCallAction(context,
-                TelecomConstants.ACTION_ACCEPT_CALL, CALL_BUTTON_REQUEST_CODE);
-        mHangupCallAction =  getCurrentCallAction(context,
-                TelecomConstants.ACTION_HANG_UP_CALL, CALL_BUTTON_REQUEST_CODE);
-    }
-
-    private PendingIntent getCurrentCallAction(Context context,
-            String action, int requestcode) {
-        Intent intent = new Intent(TelecomConstants.INTENT_ACTION_STREAM_CALL_CONTROL);
-        intent.setPackage(context.getPackageName());
-        intent.putExtra(TelecomConstants.EXTRA_STREAM_CALL_ACTION, action);
-        PendingIntent pendingIntent =
-                PendingIntent.getBroadcast(
-                        context,
-                        requestcode,
-                        intent,
-                        PendingIntent.FLAG_CANCEL_CURRENT
-                );
-        return pendingIntent;
-    }
-
-    public StreamCard convert(Call call, Context context, boolean isMuted,
-            long callStartTime, String dialerPackage) {
-        long timeStamp = System.currentTimeMillis() - call.getDetails().getConnectTimeMillis();
-        int callState = call.getState();
-        String number = TelecomUtils.getNumber(call);
-        String displayName = TelecomUtils.getDisplayName(context, call);
-        long digits = Long.valueOf(number.replaceAll("[^0-9]", ""));
-
-        PendingIntent dialerPendingIntent =
-                PendingIntent.getActivity(
-                        context,
-                        0,
-                        context.getPackageManager().getLaunchIntentForPackage(dialerPackage),
-                        PendingIntent.FLAG_UPDATE_CURRENT
-                );
-
-        StreamCard.Builder builder = new StreamCard.Builder(StreamConstants.CARD_TYPE_CURRENT_CALL,
-                digits /* id */, timeStamp);
-        builder.setPrimaryText(displayName);
-        builder.setSecondaryText(getCallState(context, callState));
-
-        Bitmap phoneIcon = BitmapUtils.getBitmap(
-                (VectorDrawable) context.getDrawable(R.drawable.ic_phone));
-        builder.setPrimaryIcon(phoneIcon);
-        builder.setSecondaryIcon(TelecomUtils.createStreamCardSecondaryIcon(context, number));
-        builder.setClickAction(dialerPendingIntent);
-        builder.setCardExtension(createCurrentCallExtension(context, callStartTime, displayName,
-                callState, isMuted, number));
-        return builder.build();
-    }
-
-    private CurrentCallExtension createCurrentCallExtension(Context context, long callStartTime,
-            String displayName, int callState, boolean isMuted, String number) {
-
-        Bitmap contactPhoto = TelecomUtils
-                .getContactPhotoFromNumber(context.getContentResolver(), number);
-        CurrentCallExtension extension
-                = new CurrentCallExtension(callStartTime, displayName, callState, isMuted,
-                contactPhoto, mMuteAction, mUnMuteAction, mAcceptCallAction, mHangupCallAction);
-        return extension;
-    }
-
-    private String getCallState(Context context, int state) {
-        switch (state) {
-            case Call.STATE_ACTIVE:
-                return context.getString(R.string.ongoing_call);
-            case Call.STATE_DIALING:
-                return context.getString(R.string.dialing_call);
-            case Call.STATE_DISCONNECTING:
-                return context.getString(R.string.disconnecting_call);
-            case Call.STATE_RINGING:
-                return context.getString(R.string.notification_incoming_call);
-            default:
-                return context.getString(R.string.unknown);
-        }
-    }
-
-}
diff --git a/src/com/android/car/stream/telecom/CurrentCallStreamProducer.java b/src/com/android/car/stream/telecom/CurrentCallStreamProducer.java
deleted file mode 100644
index 2b774b7..0000000
--- a/src/com/android/car/stream/telecom/CurrentCallStreamProducer.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.os.AsyncTask;
-import android.os.IBinder;
-import android.os.SystemClock;
-import android.telecom.Call;
-import android.telecom.CallAudioState;
-import android.telecom.TelecomManager;
-import android.util.Log;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamProducer;
-import com.android.car.stream.telecom.StreamInCallService.StreamInCallServiceBinder;
-
-/**
- * A {@link StreamProducer} that listens for active call events and produces a {@link StreamCard}
- */
-public class CurrentCallStreamProducer extends StreamProducer
-        implements StreamInCallService.InCallServiceCallback {
-    private static final String TAG = "CurrentCallProducer";
-
-    private StreamInCallService mInCallService;
-    private PhoneCallback mPhoneCallback;
-    private CurrentCallActionReceiver mCallActionReceiver;
-    private Call mCurrentCall;
-    private long mCurrentCallStartTime;
-
-    private CurrentCallConverter mConverter;
-    private AsyncTask mUpdateStreamItemTask;
-
-    private String mDialerPackage;
-    private TelecomManager mTelecomManager;
-
-    public CurrentCallStreamProducer(Context context) {
-        super(context);
-    }
-
-    @Override
-    public void start() {
-        super.start();
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "current call producer started");
-        }
-        mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
-        mDialerPackage = mTelecomManager.getDefaultDialerPackage();
-        mConverter = new CurrentCallConverter(mContext);
-        mPhoneCallback = new PhoneCallback();
-
-        Intent inCallServiceIntent = new Intent(mContext, StreamInCallService.class);
-        inCallServiceIntent.setAction(StreamInCallService.LOCAL_INCALL_SERVICE_BIND_ACTION);
-        mContext.bindService(inCallServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
-    }
-
-    @Override
-    public void stop() {
-        mContext.unbindService(mServiceConnection);
-        super.stop();
-    }
-
-    private void acceptCall() {
-        synchronized (mTelecomManager) {
-            if (mCurrentCall != null && mCurrentCall.getState() == Call.STATE_RINGING) {
-                mCurrentCall.answer(0 /* videoState */);
-            }
-        }
-    }
-
-    private void disconnectCall() {
-        synchronized (mTelecomManager) {
-            if (mCurrentCall != null) {
-                mCurrentCall.disconnect();
-            }
-        }
-    }
-
-    @Override
-    public void onCallAdded(Call call) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "on call added, state: " + call.getState());
-        }
-        mCurrentCall = call;
-        updateStreamCard(mCurrentCall, mContext);
-        call.registerCallback(mPhoneCallback);
-    }
-
-    @Override
-    public void onCallRemoved(Call call) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "on call removed, state: " + call.getState());
-        }
-        call.unregisterCallback(mPhoneCallback);
-        updateStreamCard(call, mContext);
-        mCurrentCall = null;
-    }
-
-    @Override
-    public void onCallAudioStateChanged(CallAudioState audioState) {
-        if (mCurrentCall != null && audioState != null) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "audio state changed, is muted? " + audioState.isMuted());
-            }
-            updateStreamCard(mCurrentCall, mContext);
-        }
-    }
-
-    private void clearUpdateStreamItemTask() {
-        if (mUpdateStreamItemTask != null) {
-            mUpdateStreamItemTask.cancel(false);
-            mUpdateStreamItemTask = null;
-        }
-    }
-
-    private void updateStreamCard(final Call call, final Context context) {
-        // Only one update may be active at a time.
-        clearUpdateStreamItemTask();
-
-        mUpdateStreamItemTask = new AsyncTask<Void, Void, StreamCard>() {
-            @Override
-            protected StreamCard doInBackground(Void... voids) {
-                try {
-                    return mConverter.convert(call, context, mInCallService.isMuted(),
-                            mCurrentCallStartTime, mDialerPackage);
-                } catch (Exception e) {
-                    Log.e(TAG, "Failed to create StreamItem.", e);
-                    throw e;
-                }
-            }
-
-            @Override
-            protected void onPostExecute(StreamCard card) {
-                if (call.getState() == Call.STATE_DISCONNECTED) {
-                    removeCard(card);
-                } else {
-                    postCard(card);
-                }
-            }
-        }.execute();
-    }
-
-    private class PhoneCallback extends Call.Callback {
-        @Override
-        public void onStateChanged(Call call, int state) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onStateChanged call: " + call + ", state: " + state);
-            }
-
-            if (state == Call.STATE_ACTIVE) {
-                mCurrentCallStartTime = SystemClock.elapsedRealtime();
-            } else {
-                mCurrentCallStartTime = 0;
-            }
-
-            switch (state) {
-                // TODO: Determine if a HUD or stream card should be displayed.
-                case Call.STATE_RINGING: // Incoming call is ringing.
-                case Call.STATE_DIALING: // Outgoing call that is dialing.
-                case Call.STATE_ACTIVE:  // Call is connected
-                case Call.STATE_DISCONNECTING: // Call is being disconnected
-                case Call.STATE_DISCONNECTED:  // Call has finished.
-                    updateStreamCard(call, mContext);
-                    mCurrentCall = call;
-                    break;
-                default:
-            }
-        }
-    }
-
-    private class CurrentCallActionReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String intentAction = intent.getAction();
-            if (!TelecomConstants.INTENT_ACTION_STREAM_CALL_CONTROL.equals(intentAction)) {
-                return;
-            }
-
-            String action = intent.getStringExtra(TelecomConstants.EXTRA_STREAM_CALL_ACTION);
-            switch (action) {
-                case TelecomConstants.ACTION_MUTE:
-                    mInCallService.setMuted(true);
-                    break;
-                case TelecomConstants.ACTION_UNMUTE:
-                    mInCallService.setMuted(false);
-                    break;
-                case TelecomConstants.ACTION_ACCEPT_CALL:
-                    acceptCall();
-                    break;
-                case TelecomConstants.ACTION_HANG_UP_CALL:
-                    disconnectCall();
-                    break;
-                default:
-            }
-        }
-    }
-
-    private ServiceConnection mServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            StreamInCallServiceBinder binder = (StreamInCallServiceBinder) service;
-            mInCallService = binder.getService();
-            mInCallService.setCallback(CurrentCallStreamProducer.this);
-
-            if (mCallActionReceiver == null) {
-                mCallActionReceiver = new CurrentCallActionReceiver();
-                mContext.registerReceiver(mCallActionReceiver,
-                        new IntentFilter(TelecomConstants.INTENT_ACTION_STREAM_CALL_CONTROL));
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            mInCallService = null;
-        }
-    };
-}
diff --git a/src/com/android/car/stream/telecom/RecentCallConverter.java b/src/com/android/car/stream/telecom/RecentCallConverter.java
deleted file mode 100644
index 77bcec8..0000000
--- a/src/com/android/car/stream/telecom/RecentCallConverter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.drawable.VectorDrawable;
-import android.net.Uri;
-import com.android.car.stream.BitmapUtils;
-import com.android.car.stream.R;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamConstants;
-
-public class RecentCallConverter {
-
-    /**
-     * Creates a StreamCard of type {@link StreamConstants#CARD_TYPE_RECENT_CALL}
-     * @return
-     */
-    public StreamCard createStreamCard(Context context, String number, long timestamp) {
-        StreamCard.Builder builder = new StreamCard.Builder(StreamConstants.CARD_TYPE_RECENT_CALL,
-                Long.parseLong(number), timestamp);
-        String displayName = TelecomUtils.getDisplayName(context, number);
-
-        builder.setPrimaryText(displayName);
-        builder.setSecondaryText(context.getString(R.string.recent_call));
-        builder.setDescription(context.getString(R.string.recent_call));
-        Bitmap phoneIcon = BitmapUtils.getBitmap(
-                (VectorDrawable) context.getDrawable(R.drawable.ic_phone));
-
-        builder.setPrimaryIcon(phoneIcon);
-        builder.setSecondaryIcon(TelecomUtils.createStreamCardSecondaryIcon(context, number));
-        builder.setClickAction(createCallPendingIntent(context, number));
-        return builder.build();
-    }
-
-    private PendingIntent createCallPendingIntent(Context context, String number) {
-        Intent callIntent = new Intent(Intent.ACTION_DIAL);
-        callIntent.setData(Uri.parse("tel: " + number));
-        callIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
-        return PendingIntent.getActivity(context, 0, callIntent,
-                PendingIntent.FLAG_UPDATE_CURRENT);
-    }
-}
diff --git a/src/com/android/car/stream/telecom/RecentCallStreamProducer.java b/src/com/android/car/stream/telecom/RecentCallStreamProducer.java
deleted file mode 100644
index 9581226..0000000
--- a/src/com/android/car/stream/telecom/RecentCallStreamProducer.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.CallLog;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.util.Log;
-import com.android.car.stream.StreamCard;
-import com.android.car.stream.StreamProducer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Loads recent calls from the call log and produces a {@link StreamCard} for each entry.
- */
-public class RecentCallStreamProducer extends StreamProducer
-        implements Loader.OnLoadCompleteListener<Cursor> {
-    private static final String TAG = "RecentCallProducer";
-    private static final long RECENT_CALL_TIME_RANGE = 6 * DateUtils.HOUR_IN_MILLIS;
-
-    /** Number of call log items to query for */
-    private static final int CALL_LOG_QUERY_LIMIT = 1;
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-    private CursorLoader mCursorLoader;
-    private StreamCard mCurrentStreamCard;
-    private long mCurrentNumber;
-    private RecentCallConverter mConverter = new RecentCallConverter();
-
-    public RecentCallStreamProducer(Context context) {
-        super(context);
-        mCursorLoader = createCallLogLoader();
-    }
-
-    @Override
-    public void start() {
-        super.start();
-        if (!hasReadCallLogPermission()) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Could not onStart RecentCallStreamProducer, permissions not granted");
-            }
-            return;
-        }
-
-        if (!mCursorLoader.isStarted()) {
-            mCursorLoader.startLoading();
-        }
-    }
-
-    @Override
-    public void stop() {
-        if (mCursorLoader.isStarted()) {
-            mCursorLoader.stopLoading();
-            removeCard(mCurrentStreamCard);
-            mCurrentStreamCard = null;
-            mCurrentNumber = 0;
-        }
-        super.stop();
-    }
-
-    @Override
-    public void onLoadComplete(Loader<Cursor> loader, Cursor cursor) {
-        if (cursor == null || !cursor.moveToFirst()) {
-            return;
-        }
-
-        int column = cursor.getColumnIndex(CallLog.Calls.NUMBER);
-        String number = cursor.getString(column);
-        column = cursor.getColumnIndex(CallLog.Calls.DATE);
-        long callTimeMs = cursor.getLong(column);
-        // Display if we have a phone number, and the call was within 6hours.
-        number = number.replaceAll("[^0-9]", "");
-        long timestamp = System.currentTimeMillis();
-        long digits = Long.parseLong(number);
-
-        if (!TextUtils.isEmpty(number) &&
-                (timestamp - callTimeMs) < RECENT_CALL_TIME_RANGE) {
-            if (mCurrentStreamCard == null || mCurrentNumber != digits) {
-                removeCard(mCurrentStreamCard);
-                mCurrentStreamCard = mConverter.createStreamCard(mContext, number, timestamp);
-                mCurrentNumber = digits;
-                postCard(mCurrentStreamCard);
-            }
-        }
-    }
-
-    private boolean hasReadCallLogPermission() {
-        return mContext.checkSelfPermission(android.Manifest.permission.READ_CALL_LOG)
-                == PackageManager.PERMISSION_GRANTED;
-    }
-
-    /**
-     * Creates a CursorLoader for Call data.
-     * Note: NOT to be used with LoaderManagers.
-     */
-    private CursorLoader createCallLogLoader() {
-        // We need to check for NULL explicitly otherwise entries with where READ is NULL
-        // may not match either the query or its negation.
-        // We consider the calls that are not yet consumed (i.e. IS_READ = 0) as "new".
-        StringBuilder where = new StringBuilder();
-        List<String> selectionArgs = new ArrayList<String>();
-
-        String selection = where.length() > 0 ? where.toString() : null;
-        Uri uri = CallLog.Calls.CONTENT_URI.buildUpon()
-                .appendQueryParameter(CallLog.Calls.LIMIT_PARAM_KEY,
-                        Integer.toString(CALL_LOG_QUERY_LIMIT))
-                .build();
-        CursorLoader loader = new CursorLoader(mContext, uri, null, selection,
-                selectionArgs.toArray(EMPTY_STRING_ARRAY), CallLog.Calls.DEFAULT_SORT_ORDER);
-        loader.registerListener(0, this /* OnLoadCompleteListener */);
-        return loader;
-    }
-
-}
diff --git a/src/com/android/car/stream/telecom/StreamInCallService.java b/src/com/android/car/stream/telecom/StreamInCallService.java
deleted file mode 100644
index fef7155..0000000
--- a/src/com/android/car/stream/telecom/StreamInCallService.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-import android.telecom.Call;
-import android.telecom.CallAudioState;
-import android.telecom.InCallService;
-import android.util.Log;
-
-/**
- * {@link InCallService} to listen for incoming calls and changes in call state.
- */
-public class StreamInCallService extends InCallService {
-    public static final String LOCAL_INCALL_SERVICE_BIND_ACTION = "stream_incall_service_action";
-    private static final String TAG = "StreamInCallService";
-    private final IBinder mBinder = new StreamInCallServiceBinder();
-
-    private InCallServiceCallback mCallback;
-
-    /**
-     * Callback interface to receive changes in the call state.
-     */
-    public interface InCallServiceCallback {
-        void onCallAdded(Call call);
-
-        void onCallRemoved(Call call);
-
-        void onCallAudioStateChanged(CallAudioState audioState);
-    }
-
-    public class StreamInCallServiceBinder extends Binder {
-        StreamInCallService getService() {
-            return StreamInCallService.this;
-        }
-    }
-
-    public void setCallback(InCallServiceCallback callback) {
-        mCallback = callback;
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        // This service can be bound by the framework or a local stream producer.
-        // Check the action and return the appropriate IBinder.
-        if (LOCAL_INCALL_SERVICE_BIND_ACTION.equals(intent.getAction())) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onBind with action: LOCAL_INCALL_SERVICE_BIND_ACTION," +
-                        " returning StreamInCallServiceBinder");
-            }
-            return mBinder;
-        }
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onBind without action specified, returning InCallService");
-        }
-        return super.onBind(intent);
-    }
-
-    @Override
-    public void onCallAdded(Call call) {
-        if (mCallback != null) {
-            mCallback.onCallAdded(call);
-        }
-    }
-
-    @Override
-    public void onCallRemoved(Call call) {
-        if (mCallback != null) {
-            mCallback.onCallRemoved(call);
-        }
-    }
-
-    @Override
-    public void onCallAudioStateChanged(CallAudioState audioState) {
-        if (mCallback != null) {
-            mCallback.onCallAudioStateChanged(audioState);
-        }
-        super.onCallAudioStateChanged(audioState);
-    }
-
-    public boolean isMuted() {
-        CallAudioState audioState = getCallAudioState();
-        return audioState != null && audioState.isMuted();
-    }
-}
diff --git a/src/com/android/car/stream/telecom/TelecomConstants.java b/src/com/android/car/stream/telecom/TelecomConstants.java
deleted file mode 100644
index c5189fc..0000000
--- a/src/com/android/car/stream/telecom/TelecomConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-public class TelecomConstants {
-    public static final String INTENT_ACTION_STREAM_CALL_CONTROL
-            = "com.google.android.car.stream.telecom.CALL_CONTROL";
-    public static final String EXTRA_STREAM_CALL_ACTION
-            = "com.google.android.car.stream.telecom.ACTION";
-
-    public static final String ACTION_MUTE = "mute";
-    public static final String ACTION_UNMUTE = "unmute";
-    public static final String ACTION_HANG_UP_CALL = "hang_up_call";
-    public static final String ACTION_ACCEPT_CALL = "accept_call";
-}
diff --git a/src/com/android/car/stream/telecom/TelecomUtils.java b/src/com/android/car/stream/telecom/TelecomUtils.java
deleted file mode 100644
index 3d56e70..0000000
--- a/src/com/android/car/stream/telecom/TelecomUtils.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (c) 2016, 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.stream.telecom;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Rect;
-import android.net.Uri;
-import android.provider.ContactsContract;
-import android.support.annotation.Nullable;
-import android.support.annotation.WorkerThread;
-import android.telecom.Call;
-import android.telecom.GatewayInfo;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.LruCache;
-import com.android.car.apps.common.CircleBitmapDrawable;
-import com.android.car.apps.common.LetterTileDrawable;
-import com.android.car.stream.R;
-
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Locale;
-
-/**
- * Telecom related utility methods.
- */
-public class TelecomUtils {
-    private static final int LRU_CACHE_SIZE = 4194304; /** 4 mb **/
-
-    private static final String[] CONTACT_ID_PROJECTION = new String[] {
-            ContactsContract.PhoneLookup.DISPLAY_NAME,
-            ContactsContract.PhoneLookup.TYPE,
-            ContactsContract.PhoneLookup.LABEL,
-            ContactsContract.PhoneLookup._ID
-    };
-
-    private static String sVoicemailNumber;
-
-    private static LruCache<String, Bitmap> sContactPhotoNumberCache;
-    private static LruCache<Long, Bitmap> sContactPhotoIdCache;
-    private static HashMap<String, String> sContactNameCache;
-    private static HashMap<String, Integer> sContactIdCache;
-    private static HashMap<String, String> sFormattedNumberCache;
-    private static HashMap<String, String> sDisplayNameCache;
-
-    /**
-     * Create a round bitmap icon to represent the call. If a contact photo does not exist,
-     * a letter tile will be used instead.
-     */
-    public static Bitmap createStreamCardSecondaryIcon(Context context, String number) {
-        Resources res = context.getResources();
-        Bitmap largeIcon
-                = TelecomUtils.getContactPhotoFromNumber(context.getContentResolver(), number);
-        if (largeIcon == null) {
-            LetterTileDrawable ltd = new LetterTileDrawable(res);
-            String name = TelecomUtils.getDisplayName(context, number);
-            ltd.setContactDetails(name, number);
-            ltd.setIsCircular(true);
-            int size = res.getDimensionPixelSize(R.dimen.stream_card_secondary_icon_dimen);
-            largeIcon = ltd.toBitmap(size);
-        }
-
-        return new CircleBitmapDrawable(res, largeIcon)
-                .toBitmap(res.getDimensionPixelSize(R.dimen.stream_card_secondary_icon_dimen));
-    }
-
-
-    /**
-     * Fetch contact photo by number from local cache.
-     *
-     * @param number
-     * @return Contact photo if it's in the cache, otherwise null.
-     */
-    @Nullable
-    public static Bitmap getCachedContactPhotoFromNumber(String number) {
-        if (number == null) {
-            return null;
-        }
-
-        if (sContactPhotoNumberCache == null) {
-            sContactPhotoNumberCache = new LruCache<String, Bitmap>(LRU_CACHE_SIZE) {
-                @Override
-                protected int sizeOf(String key, Bitmap value) {
-                    return value.getByteCount();
-                }
-            };
-        }
-        return sContactPhotoNumberCache.get(number);
-    }
-
-    @WorkerThread
-    public static Bitmap getContactPhotoFromNumber(ContentResolver contentResolver, String number) {
-        if (number == null) {
-            return null;
-        }
-
-        Bitmap photo = getCachedContactPhotoFromNumber(number);
-        if (photo != null) {
-            return photo;
-        }
-
-        int id = getContactIdFromNumber(contentResolver, number);
-        if (id == 0) {
-            return null;
-        }
-        photo = getContactPhotoFromId(contentResolver, id);
-        if (photo != null) {
-            sContactPhotoNumberCache.put(number, photo);
-        }
-        return photo;
-    }
-
-    /**
-     * Return the contact id for the given contact id
-     * @param id the contact id to get the photo for
-     * @return the contact photo if it is found, null otherwise.
-     */
-    public static Bitmap getContactPhotoFromId(ContentResolver contentResolver, long id) {
-        if (sContactPhotoIdCache == null) {
-            sContactPhotoIdCache = new LruCache<Long, Bitmap>(LRU_CACHE_SIZE) {
-                @Override
-                protected int sizeOf(Long key, Bitmap value) {
-                    return value.getByteCount();
-                }
-            };
-        } else if (sContactPhotoIdCache.get(id) != null) {
-            return sContactPhotoIdCache.get(id);
-        }
-
-        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
-        InputStream photoDataStream = ContactsContract.Contacts.openContactPhotoInputStream(
-                contentResolver, photoUri, true);
-
-        BitmapFactory.Options options = new BitmapFactory.Options();
-        options.inPreferQualityOverSpeed = true;
-        // Scaling will be handled by later. We shouldn't scale multiple times to avoid
-        // quality lost due to multiple potential scaling up and down.
-        options.inScaled = false;
-
-        Rect nullPadding = null;
-        Bitmap photo = BitmapFactory.decodeStream(photoDataStream, nullPadding, options);
-        if (photo != null) {
-            photo.setDensity(Bitmap.DENSITY_NONE);
-            sContactPhotoIdCache.put(id, photo);
-        }
-        return photo;
-    }
-
-    /**
-     * Return the contact id for the given phone number.
-     * @param number Caller phone number
-     * @return the contact id if it is found, 0 otherwise.
-     */
-    public static int getContactIdFromNumber(ContentResolver cr, String number) {
-        if (number == null || number.isEmpty()) {
-            return 0;
-        }
-        if (sContactIdCache == null) {
-            sContactIdCache = new HashMap<>();
-        } else if (sContactIdCache.containsKey(number)) {
-            return sContactIdCache.get(number);
-        }
-
-        Uri uri = Uri.withAppendedPath(
-                ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
-                Uri.encode(number));
-        Cursor cursor = cr.query(uri, CONTACT_ID_PROJECTION, null, null, null);
-
-        try {
-            if (cursor != null && cursor.moveToFirst()) {
-                int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
-                sContactIdCache.put(number, id);
-                return id;
-            }
-        }
-        finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-        return 0;
-    }
-
-    public static String getDisplayName(Context context, String number) {
-        return getDisplayName(context, number, (Uri)null);
-    }
-
-    public static String getDisplayName(Context context, Call call) {
-        // A call might get created before its children are added. In that case, the display name
-        // would go from "Unknown" to "Conference call" therefore we don't want to cache it.
-        if (call.getChildren() != null && call.getChildren().size() > 0) {
-            return context.getString(R.string.conference_call);
-        }
-        return getDisplayName(context, getNumber(call), getGatewayInfoOriginalAddress(call));
-    }
-
-    private static Uri getGatewayInfoOriginalAddress(Call call) {
-        if (call == null || call.getDetails() == null) {
-            return null;
-        }
-        GatewayInfo gatewayInfo = call.getDetails().getGatewayInfo();
-
-        if (gatewayInfo != null && gatewayInfo.getOriginalAddress() != null) {
-            return gatewayInfo.getGatewayAddress();
-        }
-        return null;
-    }
-
-    /**
-     * Return the phone number of the call. This CAN return null under certain circumstances such
-     * as if the incoming number is hidden.
-     */
-    public static String getNumber(Call call) {
-        if (call == null || call.getDetails() == null) {
-            return null;
-        }
-
-        Uri gatewayInfoOriginalAddress = getGatewayInfoOriginalAddress(call);
-        if (gatewayInfoOriginalAddress != null) {
-            return gatewayInfoOriginalAddress.getSchemeSpecificPart();
-        }
-
-        if (call.getDetails().getHandle() != null) {
-            return call.getDetails().getHandle().getSchemeSpecificPart();
-        }
-        return null;
-    }
-
-    private static String getContactNameFromNumber(ContentResolver cr, String number) {
-        if (sContactNameCache == null) {
-            sContactNameCache = new HashMap<>();
-        } else if (sContactNameCache.containsKey(number)) {
-            return sContactNameCache.get(number);
-        }
-
-        Uri uri = Uri.withAppendedPath(
-                ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
-
-        Cursor cursor = null;
-        String name = null;
-        try {
-            cursor = cr.query(uri,
-                    new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
-            if (cursor != null && cursor.moveToFirst()) {
-                name = cursor.getString(0);
-                sContactNameCache.put(number, name);
-            }
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-        return name;
-    }
-
-    private static String getDisplayName(
-            Context context, String number, Uri gatewayOriginalAddress) {
-        if (sDisplayNameCache == null) {
-            sDisplayNameCache = new HashMap<>();
-        } else {
-            if (sDisplayNameCache.containsKey(number)) {
-                return sDisplayNameCache.get(number);
-            }
-        }
-
-        if (TextUtils.isEmpty(number)) {
-            return context.getString(R.string.unknown);
-        }
-        ContentResolver cr = context.getContentResolver();
-        String name;
-        if (number.equals(getVoicemailNumber(context))) {
-            name = context.getString(R.string.voicemail);
-        } else {
-            name = getContactNameFromNumber(cr, number);
-        }
-
-        if (name == null) {
-            name = getFormattedNumber(context, number);
-        }
-        if (name == null && gatewayOriginalAddress != null) {
-            name = gatewayOriginalAddress.getSchemeSpecificPart();
-        }
-        if (name == null) {
-            name = context.getString(R.string.unknown);
-        }
-        sDisplayNameCache.put(number, name);
-        return name;
-    }
-
-    public static String getVoicemailNumber(Context context) {
-        if (sVoicemailNumber == null) {
-            TelephonyManager tm =
-                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-            sVoicemailNumber = tm.getVoiceMailNumber();
-        }
-        return sVoicemailNumber;
-    }
-
-    public static String getFormattedNumber(Context context, @Nullable String number) {
-        if (TextUtils.isEmpty(number)) {
-            return "";
-        }
-
-        if (sFormattedNumberCache == null) {
-            sFormattedNumberCache = new HashMap<>();
-        } else {
-            if (sFormattedNumberCache.containsKey(number)) {
-                return sFormattedNumberCache.get(number);
-            }
-        }
-
-        String countryIso = getSimRegionCode(context);
-        String e164 = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-        String formattedNumber = PhoneNumberUtils.formatNumber(number, e164, countryIso);
-        formattedNumber = TextUtils.isEmpty(formattedNumber) ? number : formattedNumber;
-        sFormattedNumberCache.put(number, formattedNumber);
-        return formattedNumber;
-    }
-
-    /**
-     * Wrapper around TelephonyManager.getSimCountryIso() that will fallback to locale or USA ISOs
-     * if it finds bogus data.
-     */
-    private static String getSimRegionCode(Context context) {
-        TelephonyManager telephonyManager =
-                (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-
-        // This can be null on some phones (and is null on robolectric default TelephonyManager)
-        String countryIso = telephonyManager.getSimCountryIso();
-        if (TextUtils.isEmpty(countryIso) || countryIso.length() != 2) {
-            countryIso = Locale.getDefault().getCountry();
-            if (countryIso == null || countryIso.length() != 2) {
-                countryIso = "US";
-            }
-        }
-
-        return countryIso.toUpperCase(Locale.US);
-    }
-}
\ No newline at end of file