# Summary
Introduces a trait-based platform abstraction layer that makes the boundary
between platform-specific and shared code explicit and compile-time verified.
The TLDR version of this new trait stuff works:
1. Define a `PlatformInterface` trait.
2. Each platform defines a zero-sized struct implementing the trait (ex `WebPlatform`).
3. Create an ifdef'd type alias on those structs:
```rust
#[cfg(feature = "web")]
pub type Platform = web::WebPlatform;
#[cfg(all(feature = "desktop"))]
pub type Platform = desktop::DesktopPlatform;
#[cfg(all(feature = "mobile", not(feature = "web")))]
pub type Platform = mobile::MobilePlatform;
```
5. Add a compile time assertion that `Platform` implements `PlatformInterface`.
# Motivation
Previously, platform code used a mix of pub use re-exports and #[cfg] blocks
that made it difficult to understand what each platform must implement. The
new trait-based approach provides:
- Clear documentation of the platform contract
- Compile-time verification that all platforms implement required
functionality
- Ability to cargo check without feature flags (via stub platform)
# Changes
New traits in imp/mod.rs:
- PlatformInterface - logging, permissions, network, config, storage. Overall this the trait that platforms must satify to compile.
- AudioSystemInterface - audio system initialization and recording
- AudioPlayerInterface - opus audio playback
Type aliases:
- Platform, AudioSystem, AudioPlayer resolve to the correct types based on
feature flags
Call site updates:
- Changed from imp::function() to Platform::function() syntax
- Removed ImpRead/ImpWrite helper traits in favor of direct bounds
# Testing
Manual testing reveals that Web and Desktop still work, I (Liam) have not tested the mobile version beyond compilation.
Co-authored-by: Liam Warfield <liam.warfield@gmail.com>
Reviewed-on: #18
Co-authored-by: Sam Sartor <me@samsartor.com>
Co-committed-by: Sam Sartor <me@samsartor.com>
This adds android builds to the CI infrastructure. These builds generate an `apk` file that you can download and install.
- Adds a new container build job that builds a container with all the required android dependencies
- Adds a new release build that builds an android apk
- Updated the imp module to split out mobile and desktop behavior
- Adds logic to request microphone permissions
- Added a custom android manifest that declares the required permissions
Reviewed-on: #9
The PR was merged into upstream. They haven't cut a release yet though so we still need to pull from git.
Reviewed-on: #7
Reviewed-by: Sam Sartor <cap@samsartor.com>
Reviewed-on: #3
Automatically choose supported profile
Play stream once created
Co-authored-by: Sam Sartor <me@samsartor.com>
Co-committed-by: Sam Sartor <me@samsartor.com>