Skip to content
Snippets Groups Projects
Commit 70176ae6 authored by Archie Pusaka's avatar Archie Pusaka Committed by Gerrit Code Review
Browse files

Merge "Floss: Avoid non-empty battery result" into main

parents 40916534 d99a1fc6
No related branches found
No related tags found
No related merge requests found
...@@ -41,4 +41,9 @@ impl IBatteryProviderManager for IBatteryProviderManagerDBus { ...@@ -41,4 +41,9 @@ impl IBatteryProviderManager for IBatteryProviderManagerDBus {
fn set_battery_info(&mut self, battery_provider_id: u32, battery_set: BatterySet) { fn set_battery_info(&mut self, battery_provider_id: u32, battery_set: BatterySet) {
dbus_generated!() dbus_generated!()
} }
#[dbus_method("RemoveBatteryInfo")]
fn remove_battery_info(&mut self, battery_provider_id: u32, address: String, uuid: String) {
dbus_generated!()
}
} }
...@@ -3,6 +3,7 @@ use crate::callbacks::Callbacks; ...@@ -3,6 +3,7 @@ use crate::callbacks::Callbacks;
use crate::uuid; use crate::uuid;
use crate::Message; use crate::Message;
use crate::RPCProxy; use crate::RPCProxy;
use itertools::Itertools;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use tokio::sync::mpsc::Sender; use tokio::sync::mpsc::Sender;
...@@ -137,11 +138,22 @@ impl Batteries { ...@@ -137,11 +138,22 @@ impl Batteries {
} }
} }
pub fn remove_battery_set(&mut self, uuid: &String) {
self.0.retain(|battery_set| &battery_set.source_uuid != uuid);
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
/// Returns the best BatterySet from among reported battery data. /// Returns the best BatterySet from among reported battery data.
pub fn pick_best(&self) -> Option<BatterySet> { pub fn pick_best(&self) -> Option<BatterySet> {
self.0 self.0
.iter() .iter()
.find(|battery_set| battery_set.source_uuid == uuid::BAS) .filter(|battery_set| !battery_set.batteries.is_empty())
// Now we prefer BAS, but we might need to prioritize other sources first
// TODO (b/295577710): Make a preference list
.find_or_first(|battery_set| battery_set.source_uuid == uuid::BAS)
.or_else(|| self.0.first()) .or_else(|| self.0.first())
.cloned() .cloned()
} }
......
...@@ -25,6 +25,9 @@ pub trait IBatteryProviderManager { ...@@ -25,6 +25,9 @@ pub trait IBatteryProviderManager {
/// Updates the battery information for the battery associated with battery_id. /// Updates the battery information for the battery associated with battery_id.
fn set_battery_info(&mut self, battery_provider_id: u32, battery_set: BatterySet); fn set_battery_info(&mut self, battery_provider_id: u32, battery_set: BatterySet);
/// Removes the battery information for the battery associated with battery_id.
fn remove_battery_info(&mut self, battery_provider_id: u32, address: String, uuid: String);
} }
/// Represents the BatteryProviderManager, a central point for collecting battery information from /// Represents the BatteryProviderManager, a central point for collecting battery information from
...@@ -75,6 +78,16 @@ impl IBatteryProviderManager for BatteryProviderManager { ...@@ -75,6 +78,16 @@ impl IBatteryProviderManager for BatteryProviderManager {
self.remove_battery_provider_callback(battery_provider_id); self.remove_battery_provider_callback(battery_provider_id);
} }
fn remove_battery_info(&mut self, _battery_provider_id: u32, address: String, uuid: String) {
if let Some(batteries) = self.battery_info.get_mut(&address) {
batteries.remove_battery_set(&uuid);
if batteries.is_empty() {
self.battery_info.remove(&address);
}
}
}
fn set_battery_info(&mut self, _battery_provider_id: u32, battery_set: BatterySet) { fn set_battery_info(&mut self, _battery_provider_id: u32, battery_set: BatterySet) {
debug!( debug!(
"BatteryProviderManager received BatterySet for [{}] from \"{}\": {:?}", "BatteryProviderManager received BatterySet for [{}] from \"{}\": {:?}",
...@@ -82,11 +95,17 @@ impl IBatteryProviderManager for BatteryProviderManager { ...@@ -82,11 +95,17 @@ impl IBatteryProviderManager for BatteryProviderManager {
battery_set.source_info.clone(), battery_set.source_info.clone(),
battery_set.clone() battery_set.clone()
); );
if battery_set.batteries.is_empty() {
return;
}
let batteries = self let batteries = self
.battery_info .battery_info
.entry(battery_set.address.clone()) .entry(battery_set.address.clone())
.or_insert_with(|| Batteries::new()); .or_insert_with(|| Batteries::new());
batteries.add_or_update_battery_set(battery_set); batteries.add_or_update_battery_set(battery_set);
if let Some(best_battery_set) = batteries.pick_best() { if let Some(best_battery_set) = batteries.pick_best() {
let tx = self.tx.clone(); let tx = self.tx.clone();
tokio::spawn(async move { tokio::spawn(async move {
......
...@@ -284,14 +284,10 @@ impl BatteryService { ...@@ -284,14 +284,10 @@ impl BatteryService {
None => return, None => return,
} }
// Let BatteryProviderManager know that BAS no longer has a battery for this device. // Let BatteryProviderManager know that BAS no longer has a battery for this device.
self.battery_provider_manager.lock().unwrap().set_battery_info( self.battery_provider_manager.lock().unwrap().remove_battery_info(
self.battery_provider_id, self.battery_provider_id,
BatterySet::new( remote_address.clone(),
remote_address.clone(), uuid::BAS.to_string(),
uuid::BAS.to_string(),
"BAS".to_string(),
vec![],
),
); );
self.battery_sets.remove(&remote_address); self.battery_sets.remove(&remote_address);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment