1 package com.google.oboe.samples.audio_device; 2 /* 3 * Copyright 2017 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 import android.annotation.TargetApi; 19 import android.content.Context; 20 import android.content.res.Resources.Theme; 21 import android.media.AudioDeviceCallback; 22 import android.media.AudioDeviceInfo; 23 import android.media.AudioManager; 24 import android.util.AttributeSet; 25 import android.widget.Spinner; 26 27 import java.util.List; 28 29 public class AudioDeviceSpinner extends Spinner { 30 31 private static final int AUTO_SELECT_DEVICE_ID = 0; 32 private static final String TAG = AudioDeviceSpinner.class.getName(); 33 private int mDirectionType; 34 private AudioDeviceAdapter mDeviceAdapter; 35 private AudioManager mAudioManager; 36 AudioDeviceSpinner(Context context)37 public AudioDeviceSpinner(Context context){ 38 super(context); 39 setup(context); 40 } 41 AudioDeviceSpinner(Context context, int mode)42 public AudioDeviceSpinner(Context context, int mode){ 43 super(context, mode); 44 setup(context); 45 } 46 AudioDeviceSpinner(Context context, AttributeSet attrs)47 public AudioDeviceSpinner(Context context, AttributeSet attrs){ 48 super(context, attrs); 49 setup(context); 50 } 51 AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr)52 public AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr){ 53 super(context, attrs, defStyleAttr); 54 setup(context); 55 } 56 AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode)57 public AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode){ 58 super(context, attrs, defStyleAttr, mode); 59 setup(context); 60 } 61 AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, int mode)62 public AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr, 63 int defStyleRes, int mode){ 64 super(context, attrs, defStyleAttr, defStyleRes, mode); 65 setup(context); 66 } AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, int mode, Theme popupTheme)67 public AudioDeviceSpinner(Context context, AttributeSet attrs, int defStyleAttr, 68 int defStyleRes, int mode, Theme popupTheme){ 69 super(context, attrs, defStyleAttr, defStyleRes, mode, popupTheme); 70 setup(context); 71 } 72 setup(Context context)73 private void setup(Context context){ 74 mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 75 76 mDeviceAdapter = new AudioDeviceAdapter(context); 77 setAdapter(mDeviceAdapter); 78 79 // Add a default entry to the list and select it 80 mDeviceAdapter.add(new AudioDeviceListEntry(AUTO_SELECT_DEVICE_ID, 81 context.getString(R.string.auto_select))); 82 setSelection(0); 83 } 84 85 @TargetApi(23) setDirectionType(int directionType)86 public void setDirectionType(int directionType){ 87 this.mDirectionType = directionType; 88 setupAudioDeviceCallback(); 89 } 90 91 @TargetApi(23) setupAudioDeviceCallback()92 private void setupAudioDeviceCallback(){ 93 94 // Note that we will immediately receive a call to onDevicesAdded with the list of 95 // devices which are currently connected. 96 mAudioManager.registerAudioDeviceCallback(new AudioDeviceCallback() { 97 @Override 98 public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) { 99 100 List<AudioDeviceListEntry> deviceList = 101 AudioDeviceListEntry.createListFrom(addedDevices, mDirectionType); 102 if (deviceList.size() > 0){ 103 mDeviceAdapter.addAll(deviceList); 104 } 105 } 106 107 public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) { 108 109 List<AudioDeviceListEntry> deviceList = 110 AudioDeviceListEntry.createListFrom(removedDevices, mDirectionType); 111 for (AudioDeviceListEntry entry : deviceList){ 112 mDeviceAdapter.remove(entry); 113 } 114 } 115 }, null); 116 } 117 } 118