Home | History | Annotate | Download | only in car
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.car;
     17 
     18 import android.car.media.CarAudioManager;
     19 import android.media.AudioAttributes;
     20 import android.os.Bundle;
     21 
     22 /**
     23  * Utility class to map car usage into AudioAttributes and the other way around.
     24  */
     25 public class CarAudioAttributesUtil {
     26 
     27     public static final int CAR_AUDIO_USAGE_CARSERVICE_BOTTOM = 100;
     28     public static final int CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY = 101;
     29     public static final int CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE = 102;
     30 
     31     /** Bundle key for storing media type. */
     32     public static final String KEY_CAR_AUDIO_TYPE = "car_audio_type";
     33 
     34     private static final int CAR_AUDIO_TYPE_DEFAULT = 0;
     35     private static final int CAR_AUDIO_TYPE_VOICE_COMMAND = 1;
     36     private static final int CAR_AUDIO_TYPE_SAFETY_ALERT = 2;
     37     private static final int CAR_AUDIO_TYPE_RADIO = 3;
     38     private static final int CAR_AUDIO_TYPE_CARSERVICE_BOTTOM = 4;
     39     private static final int CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY = 5;
     40     private static final int CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE = 6;
     41     private static final int CAR_AUDIO_TYPE_EXTERNAL_SOURCE = 7;
     42 
     43     /** Bundle key for storing routing type which is String. */
     44     public static final String KEY_EXT_ROUTING_TYPE = "ext_routing_type";
     45 
     46     public static AudioAttributes getAudioAttributesForCarUsage(int carUsage) {
     47         switch (carUsage) {
     48             case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
     49                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_MUSIC,
     50                         AudioAttributes.USAGE_MEDIA);
     51             case CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE: // default to radio
     52             case CarAudioManager.CAR_AUDIO_USAGE_RADIO:
     53                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_RADIO,
     54                         AudioAttributes.CONTENT_TYPE_MUSIC, AudioAttributes.USAGE_MEDIA);
     55             case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
     56                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
     57                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
     58             case CarAudioManager.CAR_AUDIO_USAGE_RINGTONE:
     59                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
     60                         AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
     61             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
     62                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
     63                         AudioAttributes.USAGE_VOICE_COMMUNICATION);
     64             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
     65                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_VOICE_COMMAND,
     66                         AudioAttributes.CONTENT_TYPE_SPEECH,
     67                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
     68             case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
     69                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
     70                         AudioAttributes.USAGE_ALARM);
     71             case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
     72                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
     73                         AudioAttributes.USAGE_NOTIFICATION);
     74             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
     75                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
     76                         AudioAttributes.USAGE_ASSISTANCE_SONIFICATION);
     77             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
     78                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_SAFETY_ALERT,
     79                         AudioAttributes.CONTENT_TYPE_SONIFICATION,
     80                         AudioAttributes.USAGE_NOTIFICATION);
     81             case CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
     82                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_BOTTOM,
     83                         AudioAttributes.CONTENT_TYPE_UNKNOWN,
     84                         AudioAttributes.USAGE_UNKNOWN);
     85             case CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
     86                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY,
     87                         AudioAttributes.CONTENT_TYPE_UNKNOWN,
     88                         AudioAttributes.USAGE_UNKNOWN);
     89             case CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE:
     90                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE,
     91                         AudioAttributes.CONTENT_TYPE_MUSIC,
     92                         AudioAttributes.USAGE_UNKNOWN);
     93             case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
     94             default:
     95                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_UNKNOWN,
     96                         AudioAttributes.USAGE_UNKNOWN);
     97         }
     98     }
     99 
    100     public static int getCarUsageFromAudioAttributes(AudioAttributes attr) {
    101         int usage = attr.getUsage();
    102         Bundle bundle = attr.getBundle();
    103         int type = CAR_AUDIO_TYPE_DEFAULT;
    104         if (bundle != null) {
    105             type = bundle.getInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_DEFAULT);
    106         }
    107         switch (usage) {
    108             case AudioAttributes.USAGE_MEDIA:
    109                 switch (type) {
    110                     case CAR_AUDIO_TYPE_RADIO:
    111                         return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
    112                     case CAR_AUDIO_TYPE_EXTERNAL_SOURCE:
    113                         return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
    114                     default:
    115                         return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
    116                 }
    117             case AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
    118                 if (type == CAR_AUDIO_TYPE_VOICE_COMMAND) {
    119                     return CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND;
    120                 } else {
    121                     return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
    122                 }
    123             case AudioAttributes.USAGE_VOICE_COMMUNICATION:
    124                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
    125             case AudioAttributes.USAGE_NOTIFICATION_RINGTONE:
    126                 return CarAudioManager.CAR_AUDIO_USAGE_RINGTONE;
    127             case AudioAttributes.USAGE_ALARM:
    128                 return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
    129             case AudioAttributes.USAGE_NOTIFICATION:
    130                 if (type == CAR_AUDIO_TYPE_SAFETY_ALERT) {
    131                     return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
    132                 } else {
    133                     return CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION;
    134                 }
    135             case AudioAttributes.USAGE_ASSISTANCE_SONIFICATION:
    136                 return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND;
    137             case AudioAttributes.USAGE_UNKNOWN:
    138             default: {
    139                 switch (type) {
    140                     case CAR_AUDIO_TYPE_CARSERVICE_BOTTOM:
    141                         return CAR_AUDIO_USAGE_CARSERVICE_BOTTOM;
    142                     case CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY:
    143                         return CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY;
    144                     case CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE:
    145                         return CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE;
    146                     default:
    147                         return CarAudioManager.CAR_AUDIO_USAGE_DEFAULT;
    148                 }
    149             }
    150         }
    151     }
    152 
    153     private static AudioAttributes createAudioAttributes(int contentType, int usage) {
    154         AudioAttributes.Builder builder = new AudioAttributes.Builder();
    155         return builder.setContentType(contentType).setUsage(usage).build();
    156     }
    157 
    158     private static AudioAttributes createCustomAudioAttributes(int carAudioType,
    159             int contentType, int usage) {
    160         AudioAttributes.Builder builder = new AudioAttributes.Builder();
    161         Bundle bundle = new Bundle();
    162         bundle.putInt(KEY_CAR_AUDIO_TYPE, carAudioType);
    163         return builder.setContentType(contentType).setUsage(usage).addBundle(bundle).build();
    164     }
    165 
    166     public static AudioAttributes getCarRadioAttributes(String radioType) {
    167         AudioAttributes.Builder builder = new AudioAttributes.Builder();
    168         Bundle bundle = new Bundle();
    169         bundle.putInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_RADIO);
    170         bundle.putString(KEY_EXT_ROUTING_TYPE, radioType);
    171         return builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
    172                 setUsage(AudioAttributes.USAGE_MEDIA).addBundle(bundle).build();
    173     }
    174 
    175     public static AudioAttributes getCarExtSourceAttributes(String externalSourceType) {
    176         AudioAttributes.Builder builder = new AudioAttributes.Builder();
    177         Bundle bundle = new Bundle();
    178         bundle.putInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_EXTERNAL_SOURCE);
    179         bundle.putString(KEY_EXT_ROUTING_TYPE, externalSourceType);
    180         return builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
    181                 setUsage(AudioAttributes.USAGE_MEDIA).addBundle(bundle).build();
    182     }
    183 
    184     /**
    185      * Get ext routing type from given AudioAttributes.
    186      * @param attr
    187      * @return {@link CarAudioManager#CAR_RADIO_TYPE_AM_FM} if ext routing info does not exist.
    188      */
    189     public static String getExtRouting(AudioAttributes attr) {
    190         Bundle bundle = attr.getBundle();
    191         String extRouting = CarAudioManager.CAR_RADIO_TYPE_AM_FM;
    192         if (bundle != null) {
    193             extRouting = bundle.getString(KEY_EXT_ROUTING_TYPE);
    194         }
    195         return extRouting;
    196     }
    197 }
    198