1 /*
2  * Copyright (C) 2021 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 
17 package com.android.car.audio;
18 
19 import static com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport.DUMP_INFO;
20 
21 import android.annotation.NonNull;
22 import android.hardware.automotive.audiocontrol.DuckingInfo;
23 import android.media.AudioAttributes;
24 import android.util.IndentingPrintWriter;
25 
26 import com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport;
27 
28 import java.util.List;
29 import java.util.Objects;
30 
31 /**
32  * Ducking information for a given car audio zone based on its focus state.
33  */
34 public final class CarDuckingInfo {
35     public final int mZoneId;
36     public final List<String> mAddressesToDuck;
37     public final List<String> mAddressesToUnduck;
38     public final int[] mUsagesHoldingFocus;
39 
CarDuckingInfo(int zoneId, @NonNull List<String> addressesToDuck, @NonNull List<String> addressesToUnduck, @NonNull int[] usagesHoldingFocus)40     public CarDuckingInfo(int zoneId, @NonNull List<String> addressesToDuck,
41             @NonNull List<String> addressesToUnduck, @NonNull int[] usagesHoldingFocus) {
42         mZoneId = zoneId;
43         mAddressesToDuck = Objects.requireNonNull(addressesToDuck);
44         mAddressesToUnduck = Objects.requireNonNull(addressesToUnduck);
45         mUsagesHoldingFocus = Objects.requireNonNull(usagesHoldingFocus);
46     }
47 
48     /**
49      * Creates {@link DuckingInfo} instance from contents of {@link CarDuckingInfo}.
50      *
51      * <p>Converts usages to XSD strings as part of this process.
52      */
generateDuckingInfo()53     public DuckingInfo generateDuckingInfo() {
54         DuckingInfo duckingInfo = new DuckingInfo();
55         duckingInfo.zoneId = mZoneId;
56         duckingInfo.deviceAddressesToDuck = mAddressesToDuck.toArray(new String[0]);
57         duckingInfo.deviceAddressesToUnduck = mAddressesToUnduck.toArray(new String[0]);
58         String[] usageStrings = new String[mUsagesHoldingFocus.length];
59         for (int i = 0; i < mUsagesHoldingFocus.length; i++) {
60             usageStrings[i] = AudioAttributes.usageToXsdString(mUsagesHoldingFocus[i]);
61         }
62         duckingInfo.usagesHoldingFocus = usageStrings;
63 
64         return duckingInfo;
65     }
66 
67     @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO)
dump(IndentingPrintWriter writer)68     void dump(IndentingPrintWriter writer) {
69         writer.printf("Ducking Info for zone %d \n", mZoneId);
70         writer.increaseIndent();
71         writer.printf("Addresses to duck: %s\n",
72                 String.join(", ", mAddressesToDuck));
73         writer.printf("Addresses to unduck: %s\n",
74                 String.join(", ", mAddressesToUnduck));
75         writer.println("Usages holding focus:");
76         writer.increaseIndent();
77         for (int usage : mUsagesHoldingFocus) {
78             writer.printf("%s, ", AudioAttributes.usageToXsdString(usage));
79         }
80         writer.decreaseIndent();
81         writer.println();
82         writer.decreaseIndent();
83     }
84 }
85