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 */
16package com.android.car;
17
18import android.car.media.CarAudioManager;
19import android.media.AudioAttributes;
20import android.os.Bundle;
21
22/**
23 * Utility class to map car usage into AudioAttributes and the other way around.
24 */
25public 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
30    /** Bundle key for storing media type */
31    public static final String KEY_CAR_AUDIO_TYPE = "car_audio_type";
32    public static final int CAR_AUDIO_TYPE_DEFAULT = 0;
33    public static final int CAR_AUDIO_TYPE_VOICE_COMMAND = 1;
34    public static final int CAR_AUDIO_TYPE_SAFETY_ALERT = 2;
35    public static final int CAR_AUDIO_TYPE_RADIO = 3;
36    public static final int CAR_AUDIO_TYPE_CARSERVICE_BOTTOM = 4;
37    public static final int CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY = 5;
38
39    public static AudioAttributes getAudioAttributesForCarUsage(int carUsage) {
40        switch (carUsage) {
41            case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
42                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_MUSIC,
43                        AudioAttributes.USAGE_MEDIA);
44            case CarAudioManager.CAR_AUDIO_USAGE_RADIO:
45                return createCustomAudioAttributes(CAR_AUDIO_TYPE_RADIO,
46                        AudioAttributes.CONTENT_TYPE_MUSIC, AudioAttributes.USAGE_MEDIA);
47            case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
48                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
49                        AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
50            case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
51                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
52                        AudioAttributes.USAGE_VOICE_COMMUNICATION);
53            case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
54                return createCustomAudioAttributes(CAR_AUDIO_TYPE_VOICE_COMMAND,
55                        AudioAttributes.CONTENT_TYPE_SPEECH,
56                        AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
57            case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
58                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
59                        AudioAttributes.USAGE_ALARM);
60            case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
61                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
62                        AudioAttributes.USAGE_NOTIFICATION);
63            case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
64                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
65                        AudioAttributes.USAGE_ASSISTANCE_SONIFICATION);
66            case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
67                return createCustomAudioAttributes(CAR_AUDIO_TYPE_SAFETY_ALERT,
68                        AudioAttributes.CONTENT_TYPE_SONIFICATION,
69                        AudioAttributes.USAGE_NOTIFICATION);
70            case CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
71                return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_BOTTOM,
72                        AudioAttributes.CONTENT_TYPE_UNKNOWN,
73                        AudioAttributes.USAGE_UNKNOWN);
74            case CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
75                return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY,
76                        AudioAttributes.CONTENT_TYPE_UNKNOWN,
77                        AudioAttributes.USAGE_UNKNOWN);
78            case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
79            default:
80                return createAudioAttributes(AudioAttributes.CONTENT_TYPE_UNKNOWN,
81                        AudioAttributes.USAGE_UNKNOWN);
82        }
83    }
84
85    public static int getCarUsageFromAudioAttributes(AudioAttributes attr) {
86        int usage = attr.getUsage();
87        Bundle bundle = attr.getBundle();
88        int type = CAR_AUDIO_TYPE_DEFAULT;
89        if (bundle != null) {
90            type = bundle.getInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_DEFAULT);
91        }
92        switch (usage) {
93            case AudioAttributes.USAGE_MEDIA:
94                if (type == CAR_AUDIO_TYPE_RADIO) {
95                    return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
96                } else {
97                    return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
98                }
99            case AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
100                if (type == CAR_AUDIO_TYPE_VOICE_COMMAND) {
101                    return CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND;
102                } else {
103                    return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
104                }
105            case AudioAttributes.USAGE_VOICE_COMMUNICATION:
106                return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
107            case AudioAttributes.USAGE_ALARM:
108                return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
109            case AudioAttributes.USAGE_NOTIFICATION:
110                if (type == CAR_AUDIO_TYPE_SAFETY_ALERT) {
111                    return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
112                } else {
113                    return CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION;
114                }
115            case AudioAttributes.USAGE_ASSISTANCE_SONIFICATION:
116                return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND;
117            case AudioAttributes.USAGE_UNKNOWN:
118            default:
119                if (type == CAR_AUDIO_TYPE_CARSERVICE_BOTTOM) {
120                    return CAR_AUDIO_USAGE_CARSERVICE_BOTTOM;
121                } else if (type == CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY) {
122                    return CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY;
123                }
124                return CarAudioManager.CAR_AUDIO_USAGE_DEFAULT;
125        }
126    }
127
128    private static AudioAttributes createAudioAttributes(int contentType, int usage) {
129        AudioAttributes.Builder builder = new AudioAttributes.Builder();
130        return builder.setContentType(contentType).setUsage(usage).build();
131    }
132
133    private static AudioAttributes createCustomAudioAttributes(int carAudioType,
134            int contentType, int usage) {
135        AudioAttributes.Builder builder = new AudioAttributes.Builder();
136        Bundle bundle = new Bundle();
137        bundle.putInt(KEY_CAR_AUDIO_TYPE, carAudioType);
138        return builder.setContentType(contentType).setUsage(usage).addBundle(bundle).build();
139    }
140}
141