1 /* 2 * Copyright (C) 2022 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.BOILERPLATE_CODE; 20 21 import android.media.AudioAttributes; 22 import android.media.AudioFocusInfo; 23 import android.media.AudioManager; 24 import android.os.Build; 25 import android.os.Bundle; 26 27 import com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport; 28 29 @ExcludeFromCodeCoverageGeneratedReport(reason = BOILERPLATE_CODE) 30 public final class AudioFocusInfoBuilder { 31 private int mUsage; 32 private int mClientUid; 33 private String mClientId; 34 private int mGainRequest; 35 private String mPackageName = "com.android.car.audio"; 36 private Bundle mBundle = null; 37 private int mLossReceived = AudioManager.AUDIOFOCUS_NONE; 38 private int mSdk = Build.VERSION.SDK_INT; 39 private boolean mDelayedFocusRequestEnabled; 40 private boolean mPausesOnDuckRequestEnabled; 41 42 /** 43 * Set audio focus info usage 44 */ setUsage(int usage)45 public AudioFocusInfoBuilder setUsage(int usage) { 46 mUsage = usage; 47 return this; 48 } 49 50 /** 51 * Set client UID info usage 52 */ setClientUid(int clientUid)53 public AudioFocusInfoBuilder setClientUid(int clientUid) { 54 mClientUid = clientUid; 55 return this; 56 } 57 58 /** 59 * Set audio focus info client ID 60 */ setClientId(String clientId)61 public AudioFocusInfoBuilder setClientId(String clientId) { 62 mClientId = clientId; 63 return this; 64 } 65 66 /** 67 * Set audio focus info package name 68 */ setPackageName(String packageName)69 public AudioFocusInfoBuilder setPackageName(String packageName) { 70 mPackageName = packageName; 71 return this; 72 } 73 74 /** 75 * Set audio focus info gain request 76 */ setGainRequest(int gainRequest)77 public AudioFocusInfoBuilder setGainRequest(int gainRequest) { 78 mGainRequest = gainRequest; 79 return this; 80 } 81 82 /** 83 * Set audio focus info loss request 84 */ setLossReceived(int lossReceived)85 public AudioFocusInfoBuilder setLossReceived(int lossReceived) { 86 mLossReceived = lossReceived; 87 return this; 88 } 89 90 /** 91 * Set audio focus info sdk 92 */ setSdk(int sdk)93 public AudioFocusInfoBuilder setSdk(int sdk) { 94 mSdk = sdk; 95 return this; 96 } 97 98 /** 99 * Set audio focus info bundle 100 */ setBundle(Bundle bundle)101 public AudioFocusInfoBuilder setBundle(Bundle bundle) { 102 mBundle = bundle; 103 return this; 104 } 105 106 /** 107 * Set whether delayed focus request should be enabled in audio focus info 108 */ setDelayedFocusRequestEnable(boolean delayedFocusRequestEnabled)109 public AudioFocusInfoBuilder setDelayedFocusRequestEnable(boolean delayedFocusRequestEnabled) { 110 mDelayedFocusRequestEnabled = delayedFocusRequestEnabled; 111 return this; 112 } 113 114 /** 115 * Set whether pause on duck should be enabled in audio focus info 116 */ setPausesOnDuckRequestEnable(boolean pausesOnDuckRequestEnabled)117 public AudioFocusInfoBuilder setPausesOnDuckRequestEnable(boolean pausesOnDuckRequestEnabled) { 118 mPausesOnDuckRequestEnabled = pausesOnDuckRequestEnabled; 119 return this; 120 } 121 122 123 /** 124 * Build audio focus info 125 */ createAudioFocusInfo()126 public AudioFocusInfo createAudioFocusInfo() { 127 AudioAttributes.Builder builder = new AudioAttributes.Builder(); 128 if (AudioAttributes.isSystemUsage(mUsage)) { 129 builder.setSystemUsage(mUsage); 130 } else { 131 builder.setUsage(mUsage); 132 } 133 134 int flags = 0; 135 if (mBundle != null) { 136 builder = builder.addBundle(mBundle); 137 } 138 139 if (mDelayedFocusRequestEnabled) { 140 flags |= AudioManager.AUDIOFOCUS_FLAG_DELAY_OK; 141 } 142 143 if (mPausesOnDuckRequestEnabled) { 144 flags |= AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS; 145 } 146 147 return new AudioFocusInfo(builder.build(), mClientUid, mClientId, 148 mPackageName, mGainRequest, mLossReceived, flags, mSdk); 149 } 150 } 151