Merge "Add RINGTONE" into oc-mr1-dev
diff --git a/car-lib/api/current.txt b/car-lib/api/current.txt
index f5e1a6c..242c337 100644
--- a/car-lib/api/current.txt
+++ b/car-lib/api/current.txt
@@ -284,6 +284,7 @@
     field public static final int CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE = 3; // 0x3
     field public static final int CAR_AUDIO_USAGE_NOTIFICATION = 7; // 0x7
     field public static final int CAR_AUDIO_USAGE_RADIO = 2; // 0x2
+    field public static final int CAR_AUDIO_USAGE_RINGTONE = 10; // 0xa
     field public static final int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT = 9; // 0x9
     field public static final int CAR_AUDIO_USAGE_SYSTEM_SOUND = 8; // 0x8
     field public static final int CAR_AUDIO_USAGE_VOICE_CALL = 4; // 0x4
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index 52c96d2..6f32dd7 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -953,6 +953,7 @@
     field public static final int CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE = 3; // 0x3
     field public static final int CAR_AUDIO_USAGE_NOTIFICATION = 7; // 0x7
     field public static final int CAR_AUDIO_USAGE_RADIO = 2; // 0x2
+    field public static final int CAR_AUDIO_USAGE_RINGTONE = 10; // 0xa
     field public static final int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT = 9; // 0x9
     field public static final int CAR_AUDIO_USAGE_SYSTEM_SOUND = 8; // 0x8
     field public static final int CAR_AUDIO_USAGE_VOICE_CALL = 4; // 0x4
diff --git a/car-lib/src/android/car/media/CarAudioManager.java b/car-lib/src/android/car/media/CarAudioManager.java
index 1c1d718..49a7ca4 100644
--- a/car-lib/src/android/car/media/CarAudioManager.java
+++ b/car-lib/src/android/car/media/CarAudioManager.java
@@ -81,10 +81,14 @@
      */
     public static final int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT = 9;
     /**
+     * Audio usage for the ringing of a phone call.
+     */
+    public static final int CAR_AUDIO_USAGE_RINGTONE = 10;
+    /**
      * Audio usage for external audio usage.
      * @hide
      */
-    public static final int CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE = 10;
+    public static final int CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE = 11;
 
     /** @hide */
     public static final int CAR_AUDIO_USAGE_MAX = CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
diff --git a/car-lib/src/android/car/settings/CarSettings.java b/car-lib/src/android/car/settings/CarSettings.java
index 1283511..6e2a8f4 100644
--- a/car-lib/src/android/car/settings/CarSettings.java
+++ b/car-lib/src/android/car/settings/CarSettings.java
@@ -74,6 +74,13 @@
          */
         public static final String KEY_VOLUME_CALL = "android.car.VOLUME_CALL";
         /**
+         * Key for phone ring volume. This is used internally, changing this value will not change
+         * the volume.
+         *
+         * @hide
+         */
+        public static final String KEY_VOLUME_RINGTONE = "android.car.VOLUME_RINGTONE";
+        /**
          * Key for alarm volume. This is used internally, changing this value will not change the
          * volume.
          *
diff --git a/service/src/com/android/car/CarAudioAttributesUtil.java b/service/src/com/android/car/CarAudioAttributesUtil.java
index 54ed2c6..64d2571 100644
--- a/service/src/com/android/car/CarAudioAttributesUtil.java
+++ b/service/src/com/android/car/CarAudioAttributesUtil.java
@@ -55,6 +55,9 @@
             case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
+            case CarAudioManager.CAR_AUDIO_USAGE_RINGTONE:
+                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
+                        AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
                         AudioAttributes.USAGE_VOICE_COMMUNICATION);
@@ -119,6 +122,8 @@
                 }
             case AudioAttributes.USAGE_VOICE_COMMUNICATION:
                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
+            case AudioAttributes.USAGE_NOTIFICATION_RINGTONE:
+                return CarAudioManager.CAR_AUDIO_USAGE_RINGTONE;
             case AudioAttributes.USAGE_ALARM:
                 return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
             case AudioAttributes.USAGE_NOTIFICATION:
diff --git a/service/src/com/android/car/VolumeUtils.java b/service/src/com/android/car/VolumeUtils.java
index 3164aea..265615b 100644
--- a/service/src/com/android/car/VolumeUtils.java
+++ b/service/src/com/android/car/VolumeUtils.java
@@ -43,6 +43,7 @@
             VehicleAudioContextFlag.NAVIGATION_FLAG,
             VehicleAudioContextFlag.VOICE_COMMAND_FLAG,
             VehicleAudioContextFlag.CALL_FLAG,
+            VehicleAudioContextFlag.RINGTONE_FLAG,
             VehicleAudioContextFlag.ALARM_FLAG,
             VehicleAudioContextFlag.NOTIFICATION_FLAG,
             VehicleAudioContextFlag.UNKNOWN_FLAG,
@@ -67,6 +68,8 @@
                 CarSettings.Global.KEY_VOLUME_VOICE_COMMAND);
         CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.CALL_FLAG,
                 CarSettings.Global.KEY_VOLUME_CALL);
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.RINGTONE_FLAG,
+                CarSettings.Global.KEY_VOLUME_RINGTONE);
         CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.ALARM_FLAG,
                 CarSettings.Global.KEY_VOLUME_ALARM);
         CAR_AUDIO_CONTEXT_SETTINGS.put(
@@ -106,7 +109,7 @@
             case AudioManager.STREAM_SYSTEM:
                 return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
             case AudioManager.STREAM_RING:
-                return VehicleAudioContextFlag.NOTIFICATION_FLAG;
+                return VehicleAudioContextFlag.RINGTONE_FLAG;
             case AudioManager.STREAM_MUSIC:
                 return VehicleAudioContextFlag.MUSIC_FLAG;
             case AudioManager.STREAM_ALARM:
@@ -124,6 +127,8 @@
         switch (carContext) {
             case VehicleAudioContextFlag.CALL_FLAG:
                 return AudioManager.STREAM_VOICE_CALL;
+            case VehicleAudioContextFlag.RINGTONE_FLAG:
+                return AudioManager.STREAM_RING;
             case VehicleAudioContextFlag.SYSTEM_SOUND_FLAG:
                 return AudioManager.STREAM_SYSTEM;
             case VehicleAudioContextFlag.NOTIFICATION_FLAG:
diff --git a/service/src/com/android/car/hal/AudioHalService.java b/service/src/com/android/car/hal/AudioHalService.java
index 14b8319..c74ac8c 100644
--- a/service/src/com/android/car/hal/AudioHalService.java
+++ b/service/src/com/android/car/hal/AudioHalService.java
@@ -131,6 +131,8 @@
             VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
     public static final int AUDIO_CONTEXT_EXT_SOURCE_FLAG =
             VehicleAudioContextFlag.EXT_SOURCE_FLAG;
+    public static final int AUDIO_CONTEXT_RINGTONE_FLAG =
+            VehicleAudioContextFlag.RINGTONE_FLAG;
 
     public interface AudioHalFocusListener {
         /**
@@ -261,6 +263,8 @@
                 return VehicleAudioContextFlag.RADIO_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
                 return VehicleAudioContextFlag.CALL_FLAG;
+            case CarAudioManager.CAR_AUDIO_USAGE_RINGTONE:
+                return VehicleAudioContextFlag.RINGTONE_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
                 return VehicleAudioContextFlag.MUSIC_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
@@ -281,15 +285,15 @@
                 if (extType != null) {
                     switch (extType) {
                     case CarAudioManager.CAR_EXTERNAL_SOURCE_TYPE_CD_DVD:
-                        return AudioHalService.AUDIO_CONTEXT_CD_ROM_FLAG;
+                        return VehicleAudioContextFlag.CD_ROM_FLAG;
                     case CarAudioManager.CAR_EXTERNAL_SOURCE_TYPE_AUX_IN0:
                     case CarAudioManager.CAR_EXTERNAL_SOURCE_TYPE_AUX_IN1:
-                        return AudioHalService.AUDIO_CONTEXT_AUX_AUDIO_FLAG;
+                        return VehicleAudioContextFlag.AUX_AUDIO_FLAG;
                     default:
                         if (extType.startsWith("RADIO_")) {
                             return VehicleAudioContextFlag.RADIO_FLAG;
                         } else {
-                            return AudioHalService.AUDIO_CONTEXT_EXT_SOURCE_FLAG;
+                            return VehicleAudioContextFlag.EXT_SOURCE_FLAG;
                         }
                     }
                 } else { // no external source specified. fall back to radio
@@ -323,6 +327,8 @@
                 return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
             case VehicleAudioContextFlag.CALL_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
+            case VehicleAudioContextFlag.RINGTONE_FLAG:
+                return CarAudioManager.CAR_AUDIO_USAGE_RINGTONE;
             case VehicleAudioContextFlag.CD_ROM_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
             case VehicleAudioContextFlag.NOTIFICATION_FLAG:
@@ -476,7 +482,7 @@
             VehiclePropValue propValue = mVehicleHal.get(VehicleProperty.AUDIO_FOCUS);
             return toIntArray(propValue.value.int32Values);
         } catch (PropertyTimeoutException e) {
-            Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_HW_VARIANT not ready", e);
+            Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_FOCUS not ready", e);
             return new int[] { VEHICLE_AUDIO_FOCUS_STATE_LOSS, 0x0, 0};
         }
     }
diff --git a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
index 6363589..7f4aeac 100644
--- a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
+++ b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
@@ -99,6 +99,7 @@
         int contexts = v.get(VehicleAudioRoutingPolicyIndex.CONTEXTS);
         // check if all contexts are allowed ones.
         assertTrue((contexts & ~(
+                VehicleAudioContextFlag.RINGTONE_FLAG |
                 VehicleAudioContextFlag.ALARM_FLAG |
                 VehicleAudioContextFlag.CALL_FLAG |
                 VehicleAudioContextFlag.MUSIC_FLAG |