Loading packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java +39 −16 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.media.AudioAttributes; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceCallback; import android.media.AudioDeviceInfo; import android.media.AudioDeviceInfo.AudioDeviceType; import android.media.AudioManager; import android.media.MediaRecorder; import android.os.Handler; Loading Loading @@ -63,7 +64,7 @@ public final class InputRouteManager { @VisibleForTesting final List<MediaDevice> mInputMediaDevices = new CopyOnWriteArrayList<>(); private MediaDevice mSelectedInputDevice; private @AudioDeviceType int mSelectedInputDeviceType; private final Collection<InputDeviceCallback> mCallbacks = new CopyOnWriteArrayList<>(); private final Object mCallbackLock = new Object(); Loading @@ -73,12 +74,12 @@ public final class InputRouteManager { new AudioDeviceCallback() { @Override public void onAudioDevicesAdded(@NonNull AudioDeviceInfo[] addedDevices) { dispatchInputDeviceListUpdate(); applyDefaultSelectedTypeToAllPresets(); } @Override public void onAudioDevicesRemoved(@NonNull AudioDeviceInfo[] removedDevices) { dispatchInputDeviceListUpdate(); applyDefaultSelectedTypeToAllPresets(); } }; Loading @@ -92,9 +93,12 @@ public final class InputRouteManager { mAudioManager.addOnPreferredDevicesForCapturePresetChangedListener( new HandlerExecutor(handler), this::onPreferredDevicesForCapturePresetChangedListener); applyDefaultSelectedTypeToAllPresets(); } private void onPreferredDevicesForCapturePresetChangedListener( @VisibleForTesting void onPreferredDevicesForCapturePresetChangedListener( @MediaRecorder.SystemSource int capturePreset, @NonNull List<AudioDeviceAttributes> devices) { if (capturePreset == MediaRecorder.AudioSource.MIC) { Loading @@ -117,12 +121,30 @@ public final class InputRouteManager { } } // TODO(b/355684672): handle edge case where there are two devices with the same type. Only // using a single mSelectedInputDeviceType might not be enough to recognize the correct device. public @Nullable MediaDevice getSelectedInputDevice() { return mSelectedInputDevice; for (MediaDevice device : mInputMediaDevices) { if (((InputMediaDevice) device).getAudioDeviceInfoType() == mSelectedInputDeviceType) { return device; } } return null; } private void dispatchInputDeviceListUpdate() { // Get selected input device. private void applyDefaultSelectedTypeToAllPresets() { mSelectedInputDeviceType = retrieveDefaultSelectedDeviceType(); AudioDeviceAttributes deviceAttributes = createInputDeviceAttributes(mSelectedInputDeviceType); setPreferredDeviceForAllPresets(deviceAttributes); } private AudioDeviceAttributes createInputDeviceAttributes(@AudioDeviceType int type) { // Address is not used. return new AudioDeviceAttributes(AudioDeviceAttributes.ROLE_INPUT, type, /* address= */ ""); } private @AudioDeviceType int retrieveDefaultSelectedDeviceType() { List<AudioDeviceAttributes> attributesOfSelectedInputDevices = mAudioManager.getDevicesForAttributes(INPUT_ATTRIBUTES); int selectedInputDeviceAttributesType; Loading @@ -138,7 +160,10 @@ public final class InputRouteManager { } selectedInputDeviceAttributesType = attributesOfSelectedInputDevices.get(0).getType(); } return selectedInputDeviceAttributesType; } private void dispatchInputDeviceListUpdate() { // Get all input devices. AudioDeviceInfo[] audioDeviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS); Loading @@ -154,9 +179,8 @@ public final class InputRouteManager { isInputGainFixed(), getProductNameFromAudioDeviceInfo(info)); if (mediaDevice != null) { if (info.getType() == selectedInputDeviceAttributesType) { if (info.getType() == mSelectedInputDeviceType) { mediaDevice.setState(STATE_SELECTED); mSelectedInputDevice = mediaDevice; } mInputMediaDevices.add(mediaDevice); } Loading Loading @@ -190,12 +214,12 @@ public final class InputRouteManager { } public void selectDevice(@NonNull MediaDevice device) { if (!(device instanceof InputMediaDevice)) { if (!(device instanceof InputMediaDevice inputMediaDevice)) { Slog.w(TAG, "This device is not an InputMediaDevice: " + device.getName()); return; } if (device.equals(mSelectedInputDevice)) { if (inputMediaDevice.getAudioDeviceInfoType() == mSelectedInputDeviceType) { Slog.w(TAG, "This device is already selected: " + device.getName()); return; } Loading @@ -206,12 +230,11 @@ public final class InputRouteManager { return; } // TODO(b/355684672): apply address for BT devices. // Update mSelectedInputDeviceType directly based on user action. mSelectedInputDeviceType = inputMediaDevice.getAudioDeviceInfoType(); AudioDeviceAttributes deviceAttributes = new AudioDeviceAttributes( AudioDeviceAttributes.ROLE_INPUT, ((InputMediaDevice) device).getAudioDeviceInfoType(), /* address= */ ""); createInputDeviceAttributes(inputMediaDevice.getAudioDeviceInfoType()); try { setPreferredDeviceForAllPresets(deviceAttributes); } catch (IllegalArgumentException e) { Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java +175 −105 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java +39 −16 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.media.AudioAttributes; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceCallback; import android.media.AudioDeviceInfo; import android.media.AudioDeviceInfo.AudioDeviceType; import android.media.AudioManager; import android.media.MediaRecorder; import android.os.Handler; Loading Loading @@ -63,7 +64,7 @@ public final class InputRouteManager { @VisibleForTesting final List<MediaDevice> mInputMediaDevices = new CopyOnWriteArrayList<>(); private MediaDevice mSelectedInputDevice; private @AudioDeviceType int mSelectedInputDeviceType; private final Collection<InputDeviceCallback> mCallbacks = new CopyOnWriteArrayList<>(); private final Object mCallbackLock = new Object(); Loading @@ -73,12 +74,12 @@ public final class InputRouteManager { new AudioDeviceCallback() { @Override public void onAudioDevicesAdded(@NonNull AudioDeviceInfo[] addedDevices) { dispatchInputDeviceListUpdate(); applyDefaultSelectedTypeToAllPresets(); } @Override public void onAudioDevicesRemoved(@NonNull AudioDeviceInfo[] removedDevices) { dispatchInputDeviceListUpdate(); applyDefaultSelectedTypeToAllPresets(); } }; Loading @@ -92,9 +93,12 @@ public final class InputRouteManager { mAudioManager.addOnPreferredDevicesForCapturePresetChangedListener( new HandlerExecutor(handler), this::onPreferredDevicesForCapturePresetChangedListener); applyDefaultSelectedTypeToAllPresets(); } private void onPreferredDevicesForCapturePresetChangedListener( @VisibleForTesting void onPreferredDevicesForCapturePresetChangedListener( @MediaRecorder.SystemSource int capturePreset, @NonNull List<AudioDeviceAttributes> devices) { if (capturePreset == MediaRecorder.AudioSource.MIC) { Loading @@ -117,12 +121,30 @@ public final class InputRouteManager { } } // TODO(b/355684672): handle edge case where there are two devices with the same type. Only // using a single mSelectedInputDeviceType might not be enough to recognize the correct device. public @Nullable MediaDevice getSelectedInputDevice() { return mSelectedInputDevice; for (MediaDevice device : mInputMediaDevices) { if (((InputMediaDevice) device).getAudioDeviceInfoType() == mSelectedInputDeviceType) { return device; } } return null; } private void dispatchInputDeviceListUpdate() { // Get selected input device. private void applyDefaultSelectedTypeToAllPresets() { mSelectedInputDeviceType = retrieveDefaultSelectedDeviceType(); AudioDeviceAttributes deviceAttributes = createInputDeviceAttributes(mSelectedInputDeviceType); setPreferredDeviceForAllPresets(deviceAttributes); } private AudioDeviceAttributes createInputDeviceAttributes(@AudioDeviceType int type) { // Address is not used. return new AudioDeviceAttributes(AudioDeviceAttributes.ROLE_INPUT, type, /* address= */ ""); } private @AudioDeviceType int retrieveDefaultSelectedDeviceType() { List<AudioDeviceAttributes> attributesOfSelectedInputDevices = mAudioManager.getDevicesForAttributes(INPUT_ATTRIBUTES); int selectedInputDeviceAttributesType; Loading @@ -138,7 +160,10 @@ public final class InputRouteManager { } selectedInputDeviceAttributesType = attributesOfSelectedInputDevices.get(0).getType(); } return selectedInputDeviceAttributesType; } private void dispatchInputDeviceListUpdate() { // Get all input devices. AudioDeviceInfo[] audioDeviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS); Loading @@ -154,9 +179,8 @@ public final class InputRouteManager { isInputGainFixed(), getProductNameFromAudioDeviceInfo(info)); if (mediaDevice != null) { if (info.getType() == selectedInputDeviceAttributesType) { if (info.getType() == mSelectedInputDeviceType) { mediaDevice.setState(STATE_SELECTED); mSelectedInputDevice = mediaDevice; } mInputMediaDevices.add(mediaDevice); } Loading Loading @@ -190,12 +214,12 @@ public final class InputRouteManager { } public void selectDevice(@NonNull MediaDevice device) { if (!(device instanceof InputMediaDevice)) { if (!(device instanceof InputMediaDevice inputMediaDevice)) { Slog.w(TAG, "This device is not an InputMediaDevice: " + device.getName()); return; } if (device.equals(mSelectedInputDevice)) { if (inputMediaDevice.getAudioDeviceInfoType() == mSelectedInputDeviceType) { Slog.w(TAG, "This device is already selected: " + device.getName()); return; } Loading @@ -206,12 +230,11 @@ public final class InputRouteManager { return; } // TODO(b/355684672): apply address for BT devices. // Update mSelectedInputDeviceType directly based on user action. mSelectedInputDeviceType = inputMediaDevice.getAudioDeviceInfoType(); AudioDeviceAttributes deviceAttributes = new AudioDeviceAttributes( AudioDeviceAttributes.ROLE_INPUT, ((InputMediaDevice) device).getAudioDeviceInfoType(), /* address= */ ""); createInputDeviceAttributes(inputMediaDevice.getAudioDeviceInfoType()); try { setPreferredDeviceForAllPresets(deviceAttributes); } catch (IllegalArgumentException e) { Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java +175 −105 File changed.Preview size limit exceeded, changes collapsed. Show changes