• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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