mirror of
https://github.com/rust-mobile/android-activity.git
synced 2026-07-13 18:18:56 +00:00
fe171bc532
* game_activity/ffi: Drop cfg for inexistant `target_arch = "armv7"` [Rust 1.80 from July 25th 2024] points out that `armv7` is not a known, valid value for the `target_arch` cfg variable. This is confirmed by the docs not listing it either: https://doc.rust-lang.org/reference/conditional-compilation.html#target_arch Hence drop this entirely, and rely purely on `target_arch = "arm"`. [Rust 1.80 from July 25th 2024]: https://blog.rust-lang.org/2024/07/25/Rust-1.80.0.html * Fix `unexpected-cfgs` by adding `api-level-30` feature and removing `test` Some code copied from the NDK carried over the respective `feature` `cfg` guards, without ever adding the feature to the `[features]` list in `Cargo.toml`. Now that Rust detects these mishaps, we can fix it by removing `test` (bindings don't seem to be run-tested) and reexpose `ConfigurationRef::screen_round()` which was behind a previously unsettable `feature = "api-level-30"`. Also remove `unsafe impl Send/Sync for ConfigurationRef` since the upstream `ndk` already declares `Configuration` to be `Send` and `Sync`, and `RwLock` and `Arc` carry that through. * native_activity: Fix clippy lints around `NativeActivityGlue` not `SendSync` and unwritten `redraw_needed` field * CI: Remove deprecated/unmaintained `actions-rs` toolchain setup The `actions-rs` containers haven't been maintained and updated for years and don't need to: GitHub's actions environment already comes fully loaded with a complete `stable` Rust installation with the standard tools (in this case `rustfmt`). Remove the remaining toolchain setup (which was already replaced with `hecrj/setup-rust-action` elsewhere) to get rid of ancient Node 12 deprecation warnings. * Bump dependency patch-versions to fix `-Zminimal-versions` and MSRV check Use `-Zminimal-versions` in our MSRV check. This not only ensures our minimum version bounds are actually solid and tested (even if they may be a bit conservative at times, i.e. we could allow older versions except for the crates that are bumped in this patch which were explicitly build-tested), it also allows us to use this as a base for the MSRV test, and preempt us from failing it whenever a (transitive!) dependency bumps its MSRV beyond ours in a *semver-compatible* release. * Elide redundant `impl` block lifetimes following stricter Rust 1.83 lint Rust now points out that `impl<'a> (Trait for) Struct<'a>` is superfluous whenever `'a` is not used anywhere else in the `impl` block.
151 lines
4.4 KiB
Rust
151 lines
4.4 KiB
Rust
use core::fmt;
|
|
use std::sync::{Arc, RwLock};
|
|
|
|
use ndk::configuration::{
|
|
Configuration, Keyboard, KeysHidden, LayoutDir, NavHidden, Navigation, Orientation, ScreenLong,
|
|
ScreenSize, Touchscreen, UiModeNight, UiModeType,
|
|
};
|
|
|
|
/// A runtime-replacable reference to [`ndk::configuration::Configuration`].
|
|
///
|
|
/// # Warning
|
|
///
|
|
/// The value held by this reference **will change** with every [`super::MainEvent::ConfigChanged`]
|
|
/// event that is raised. You should **not** [`Clone`] this type to compare it against a
|
|
/// "new" [`super::AndroidApp::config()`] when that event is raised, since both point to the same
|
|
/// internal [`ndk::configuration::Configuration`] and will be identical.
|
|
#[derive(Clone)]
|
|
pub struct ConfigurationRef {
|
|
config: Arc<RwLock<Configuration>>,
|
|
}
|
|
impl PartialEq for ConfigurationRef {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
if Arc::ptr_eq(&self.config, &other.config) {
|
|
true
|
|
} else {
|
|
let other_guard = other.config.read().unwrap();
|
|
self.config.read().unwrap().eq(&*other_guard)
|
|
}
|
|
}
|
|
}
|
|
impl Eq for ConfigurationRef {}
|
|
|
|
impl fmt::Debug for ConfigurationRef {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
self.config.read().unwrap().fmt(f)
|
|
}
|
|
}
|
|
|
|
impl ConfigurationRef {
|
|
pub(crate) fn new(config: Configuration) -> Self {
|
|
Self {
|
|
config: Arc::new(RwLock::new(config)),
|
|
}
|
|
}
|
|
|
|
pub(crate) fn replace(&self, src: Configuration) {
|
|
self.config.write().unwrap().copy(&src);
|
|
}
|
|
|
|
// Returns a deep copy of the full application configuration
|
|
pub fn copy(&self) -> Configuration {
|
|
let mut dest = Configuration::new();
|
|
dest.copy(&self.config.read().unwrap());
|
|
dest
|
|
}
|
|
/// Returns the country code, as a [`String`] of two characters, if set
|
|
pub fn country(&self) -> Option<String> {
|
|
self.config.read().unwrap().country()
|
|
}
|
|
|
|
/// Returns the screen density in dpi.
|
|
///
|
|
/// On some devices it can return values outside of the density enum.
|
|
pub fn density(&self) -> Option<u32> {
|
|
self.config.read().unwrap().density()
|
|
}
|
|
|
|
/// Returns the keyboard type.
|
|
pub fn keyboard(&self) -> Keyboard {
|
|
self.config.read().unwrap().keyboard()
|
|
}
|
|
|
|
/// Returns keyboard visibility/availability.
|
|
pub fn keys_hidden(&self) -> KeysHidden {
|
|
self.config.read().unwrap().keys_hidden()
|
|
}
|
|
|
|
/// Returns the language, as a `String` of two characters, if a language is set
|
|
pub fn language(&self) -> Option<String> {
|
|
self.config.read().unwrap().language()
|
|
}
|
|
|
|
/// Returns the layout direction
|
|
pub fn layout_direction(&self) -> LayoutDir {
|
|
self.config.read().unwrap().layout_direction()
|
|
}
|
|
|
|
/// Returns the mobile country code.
|
|
pub fn mcc(&self) -> i32 {
|
|
self.config.read().unwrap().mcc()
|
|
}
|
|
|
|
/// Returns the mobile network code, if one is defined
|
|
pub fn mnc(&self) -> Option<i32> {
|
|
self.config.read().unwrap().mnc()
|
|
}
|
|
|
|
pub fn nav_hidden(&self) -> NavHidden {
|
|
self.config.read().unwrap().nav_hidden()
|
|
}
|
|
|
|
pub fn navigation(&self) -> Navigation {
|
|
self.config.read().unwrap().navigation()
|
|
}
|
|
|
|
pub fn orientation(&self) -> Orientation {
|
|
self.config.read().unwrap().orientation()
|
|
}
|
|
|
|
pub fn screen_height_dp(&self) -> Option<i32> {
|
|
self.config.read().unwrap().screen_height_dp()
|
|
}
|
|
|
|
pub fn screen_width_dp(&self) -> Option<i32> {
|
|
self.config.read().unwrap().screen_width_dp()
|
|
}
|
|
|
|
pub fn screen_long(&self) -> ScreenLong {
|
|
self.config.read().unwrap().screen_long()
|
|
}
|
|
|
|
#[cfg(feature = "api-level-30")]
|
|
pub fn screen_round(&self) -> ScreenRound {
|
|
self.config.read().unwrap().screen_round()
|
|
}
|
|
|
|
pub fn screen_size(&self) -> ScreenSize {
|
|
self.config.read().unwrap().screen_size()
|
|
}
|
|
|
|
pub fn sdk_version(&self) -> i32 {
|
|
self.config.read().unwrap().sdk_version()
|
|
}
|
|
|
|
pub fn smallest_screen_width_dp(&self) -> Option<i32> {
|
|
self.config.read().unwrap().smallest_screen_width_dp()
|
|
}
|
|
|
|
pub fn touchscreen(&self) -> Touchscreen {
|
|
self.config.read().unwrap().touchscreen()
|
|
}
|
|
|
|
pub fn ui_mode_night(&self) -> UiModeNight {
|
|
self.config.read().unwrap().ui_mode_night()
|
|
}
|
|
|
|
pub fn ui_mode_type(&self) -> UiModeType {
|
|
self.config.read().unwrap().ui_mode_type()
|
|
}
|
|
}
|