import { Audio, AudioMode, InterruptionModeAndroid } from 'expo-av'; import React from 'react'; import { PixelRatio, Switch, Text, View } from 'react-native'; import Button from '../../components/Button'; import ListButton from '../../components/ListButton'; interface State { modeToSet: Partial; setMode: Partial; } export default class AudioModeSelector extends React.Component { readonly state: State = { modeToSet: { interruptionModeAndroid: InterruptionModeAndroid.DuckOthers, shouldDuckAndroid: true, playThroughEarpieceAndroid: false, staysActiveInBackground: false, }, setMode: { interruptionModeAndroid: InterruptionModeAndroid.DuckOthers, shouldDuckAndroid: true, playThroughEarpieceAndroid: false, staysActiveInBackground: false, }, }; _applyMode = async () => { try { await Audio.setAudioModeAsync({ ...this.state.modeToSet }); const { modeToSet } = this.state; this.setState({ setMode: modeToSet }); } catch (error) { alert(error.message); } }; _modesEqual = (modeA: Partial, modeB: Partial) => modeA.interruptionModeAndroid === modeB.interruptionModeAndroid && modeA.playThroughEarpieceAndroid === modeB.playThroughEarpieceAndroid && modeA.shouldDuckAndroid === modeB.shouldDuckAndroid && modeA.staysActiveInBackground === modeB.staysActiveInBackground; _setMode = (interruptionModeAndroid: number) => () => this.setState((state) => ({ modeToSet: { ...state.modeToSet, interruptionModeAndroid } })); _renderToggle = ({ title, disabled, valueName, value, }: { title: string; disabled?: boolean; valueName: keyof AudioMode; value?: boolean; }) => ( {title} this.setState((state) => ({ modeToSet: { ...state.modeToSet, [valueName]: !state.modeToSet[valueName] }, })) } /> ); _renderModeSelector = ({ title, disabled, value, }: { title: string; disabled?: boolean; value: number; }) => ( ); render() { return ( {this._renderToggle({ title: 'Should be ducked', valueName: 'shouldDuckAndroid', })} {this._renderToggle({ title: 'Play through earpiece', valueName: 'playThroughEarpieceAndroid', })} {this._renderToggle({ title: 'Stay active in background', valueName: 'staysActiveInBackground', })} {this._renderModeSelector({ title: 'Do not mix', value: InterruptionModeAndroid.DoNotMix, })} {this._renderModeSelector({ title: 'Duck others', value: InterruptionModeAndroid.DuckOthers, })}