1 use super::{
2 utils::{
3 get_activity, get_package_manager, has_system_feature, with_attached, JNIEnv, JObject,
4 JResult,
5 },
6 PackageManager,
7 };
8
9 /**
10 * The Android audio features
11 */
12 #[cfg_attr(feature = "doc-cfg", doc(cfg(feature = "java-interface")))]
13 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14 pub enum AudioFeature {
15 LowLatency,
16 Output,
17 Pro,
18 Microphone,
19 Midi,
20 }
21
22 impl From<AudioFeature> for &'static str {
from(feature: AudioFeature) -> Self23 fn from(feature: AudioFeature) -> Self {
24 use AudioFeature::*;
25 match feature {
26 LowLatency => PackageManager::FEATURE_AUDIO_LOW_LATENCY,
27 Output => PackageManager::FEATURE_AUDIO_OUTPUT,
28 Pro => PackageManager::FEATURE_AUDIO_PRO,
29 Microphone => PackageManager::FEATURE_MICROPHONE,
30 Midi => PackageManager::FEATURE_MIDI,
31 }
32 }
33 }
34
35 impl AudioFeature {
36 /**
37 * Check availability of an audio feature using Android Java API
38 */
has(&self) -> Result<bool, String>39 pub fn has(&self) -> Result<bool, String> {
40 let activity = get_activity();
41
42 with_attached(activity, |env, activity| {
43 try_check_system_feature(env, activity, (*self).into())
44 })
45 .map_err(|error| error.to_string())
46 }
47 }
48
try_check_system_feature<'a>( env: &JNIEnv<'a>, activity: JObject, feature: &str, ) -> JResult<bool>49 fn try_check_system_feature<'a>(
50 env: &JNIEnv<'a>,
51 activity: JObject,
52 feature: &str,
53 ) -> JResult<bool> {
54 let package_manager = get_package_manager(env, activity)?;
55
56 has_system_feature(env, package_manager, feature)
57 }
58