Skip to main content

tauri_plugin_android_battery_optimization/
lib.rs

1use serde::{Deserialize, Serialize};
2use tauri::{
3    plugin::{Builder, PluginHandle, TauriPlugin},
4    Manager, Runtime,
5};
6
7mod commands;
8mod error;
9
10pub use commands::*;
11pub use error::Error;
12
13/// Battery optimization status returned by the plugin.
14#[derive(Debug, Clone, Deserialize, Serialize)]
15#[serde(rename_all = "camelCase")]
16pub struct BatteryStatus {
17    /// Whether the app is subject to battery optimization (Doze mode restrictions).
18    /// `true` means the app may have delayed background execution.
19    pub is_optimized: bool,
20    /// Whether the app is ignoring battery optimizations (unrestricted background usage).
21    /// `true` means the app has unrestricted background access.
22    pub is_ignoring_optimizations: bool,
23}
24
25pub struct AndroidBatteryOptimization<R: Runtime>(PluginHandle<R>);
26
27impl<R: Runtime> AndroidBatteryOptimization<R> {
28    /// Check the current battery optimization status.
29    #[cfg(target_os = "android")]
30    pub fn check_status(&self) -> Result<BatteryStatus, Error> {
31        self.0
32            .run_mobile_plugin("checkBatteryOptimizationStatus", ())
33            .map_err(|e| Error::PluginInvoke(e.to_string()))
34    }
35
36    /// Request exemption from battery optimization (shows system dialog).
37    #[cfg(target_os = "android")]
38    pub fn request_exemption(&self) -> Result<(), Error> {
39        self.0
40            .run_mobile_plugin("requestBatteryOptimizationExemption", ())
41            .map_err(|e| Error::PluginInvoke(e.to_string()))
42    }
43
44    /// Open the battery optimization settings page.
45    #[cfg(target_os = "android")]
46    pub fn open_settings(&self) -> Result<(), Error> {
47        self.0
48            .run_mobile_plugin("openBatterySettings", ())
49            .map_err(|e| Error::PluginInvoke(e.to_string()))
50    }
51}
52
53/// Initializes the plugin.
54pub fn init<R: Runtime>() -> TauriPlugin<R> {
55    Builder::new("android-battery-optimization")
56        .invoke_handler(tauri::generate_handler![
57            commands::check_battery_optimization_status,
58            commands::request_battery_optimization_exemption,
59            commands::open_battery_settings
60        ])
61        .setup(|app, api| {
62            #[cfg(target_os = "android")]
63            {
64                let handle = api.register_android_plugin(
65                    "com.plugin.android_battery_optimization",
66                    "BatteryOptimizationPlugin",
67                )?;
68                app.manage(AndroidBatteryOptimization(handle));
69            }
70            let _ = (app, api);
71            Ok(())
72        })
73        .build()
74}