PowerStatus: Implement battery low/critical notifications.

It shows a notification once the "low percentage" is reached (currently
at 15 percent) and once when the battery is about to die. This logic
should probably be revised to be based on remaining time instead. The
notification icons are simple variations of the PowerStatus icon.
This commit is contained in:
Michael Lotz
2014-10-23 20:07:21 +02:00
parent 1b1f0fbee1
commit 1180b66081
5 changed files with 96 additions and 4 deletions
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -13,7 +13,7 @@ Application PowerStatus :
PowerStatusWindow.cpp
PowerStatusView.cpp
PowerStatus.cpp
: be libshared.a [ TargetLibsupc++ ] localestub
: be translation libshared.a [ TargetLibsupc++ ] localestub
: PowerStatus.rdef
;
DoCatalogs PowerStatus :
+47
View File
@@ -46,3 +46,50 @@ resource vector_icon {
$"4C0A04010700"
};
resource(200, "battery_low") #'VICN' array {
$"6E6369660903000100010001007102001604BC00000000000000003C00004940"
$"004B000000FF2BA1D2FFFF8202000604BC00000000000000003C00004940004B"
$"000000FF84002BC36705D2FF8400FFC36603020016023A9D433BA9A6BCD9483C"
$"088A4A42A9428A8A00FFFFCC020116023D00000000000000003D000049400048"
$"0000FF010066020016033A00000000000000003A000049400047000000993FCC"
$"FF8602001602374FE739A41DBBA41D394FE74A0A044485FD00F3FFC202001602"
$"383B6C3951BCBB51BC3A3B6C4A6680441BB500FFFF9E0802062A462A46B6FEC4"
$"563A50B9D450C0DF504A46C3B9C4564A464A2E4A2E4AB6603A24C0E124B9D624"
$"2A2E2AB6602A2E02062A462A46B6FEC4563A50B9D450C0DF504A46C3B9C4564A"
$"464A2E4A2E4ABAC73A38C0E138B9D6382A2E2ABAC72A2E0206C3B9C222C3B9C2"
$"224AC4553A50C0DF50B9D4502AC222B6F9C4552AC2222A522A52B6FEC98F3A5E"
$"B9D45EC0DF5E4A52C3B9C98F4A5202042A2E2ABAC72AB6603A24B9D624C0E124"
$"4A2E4AB6604ABAC73A38C0E138B9D6380204482E48B6D148BA563A36C07036BA"
$"47362C2E2CBA562CB6D13A26BA4726C0702602063228322832B54E3A24BB9924"
$"BF1E24422842B54E4228422C422C42B8A93A30BF1E30BB9930322C32B8A9322C"
$"0204322832B71132B54E3A24BB9924BF1E24422842B54E42B7113A2CBF1E2CBB"
$"992C0605E3035048C8C34850484C3A6050605060C8C3605C545CCA5B5CC5140A"
$"0A010107000A000200021001178422040A020101000A030102000A040103000A"
$"050104000A0001051001178422040A060105000A080106000A070106023ECDCB"
$"0000000000003E554745C57F43294C"
};
resource(201, "battery_critical") #'VICN' array {
$"6E6369660903000100010001007102001604BC00000000000000003C00004940"
$"004B000000FF2BA1D2FFFF8202000604BC00000000000000003C00004940004B"
$"000000FF00002BA00404D2FF0606FF820303020016023A9D433BA9A6BCD9483C"
$"088A4A42A9428A8A00FFFFCC020116023D00000000000000003D000049400048"
$"0000FF010066020016033A00000000000000003A000049400047000000993FCC"
$"FF8602001602374FE739A41DBBA41D394FE74A0A044485FD00F3FFC202001602"
$"383B6C3951BCBB51BC3A3B6C4A6680441BB500FFFF9E0802062A462A46B6FEC4"
$"563A50B9D450C0DF504A46C3B9C4564A464A2E4A2E4AB6603A24C0E124B9D624"
$"2A2E2AB6602A2E02062A4D2A4DB6FEC7203A59B9D459C0DF594A4DC3B9C7204A"
$"4D4A2E4A2E4ABAC73A38C0E138B9D6382A2E2ABAC72A2E02064A4D4A4DC3BEC7"
$"203A59C0DF59B9D4592A4DB6F9C7202A4D2A522A52B6FEC98F3A5EB9D45EC0DF"
$"5E4A52C3B9C98F4A5202042A2E2ABAC72AB6603A24B9D624C0E1244A2E4AB660"
$"4ABAC73A38C0E138B9D6380204482E48B6D148BA563A36C07036BA47362C2E2C"
$"BA562CB6D13A26BA4726C0702602063228322832B54E3A24BB9924BF1E244228"
$"42B54E4228422C422C42B8A93A30BF1E30BB9930322C32B8A9322C0204322832"
$"B71132B54E3A24BB9924BF1E24422842B54E42B7113A2CBF1E2CBB992C0605E3"
$"035048C8C34850484C3A6050605060C8C3605C545CCA5B5CC5140A0A01010700"
$"0A00030200011001178422040A020101000A030102000A040103000A05010400"
$"0A0001051001178422040A060105000A080106000A070106023ECDCB00000000"
$"00003E554745C57F43294C"
};
+48 -3
View File
@@ -18,8 +18,10 @@
#include <AboutWindow.h>
#include <Application.h>
#include <Bitmap.h>
#include <Catalog.h>
#include <ControlLook.h>
#include <DataIO.h>
#include <Deskbar.h>
#include <Dragger.h>
#include <Drivers.h>
@@ -27,9 +29,12 @@
#include <FindDirectory.h>
#include <MenuItem.h>
#include <MessageRunner.h>
#include <Notification.h>
#include <Path.h>
#include <PopUpMenu.h>
#include <Resources.h>
#include <TextView.h>
#include <TranslationUtils.h>
#include "ACPIDriverInterface.h"
#include "APMDriverInterface.h"
@@ -52,6 +57,8 @@ const uint32 kMsgToggleExtInfo = 'texi';
const uint32 kMinIconWidth = 16;
const uint32 kMinIconHeight = 16;
const int32 kLowBatteryPercentage = 15;
PowerStatusView::PowerStatusView(PowerStatusDriverInterface* interface,
BRect frame, int32 resizingMode, int batteryID, bool inDeskbar)
@@ -196,7 +203,7 @@ PowerStatusView::_DrawBattery(BRect rect)
}
if (fHasBattery) {
if (percent <= 15)
if (percent <= kLowBatteryPercentage)
base.set_to(180, 0, 0);
else
base.set_to(20, 180, 0);
@@ -328,6 +335,7 @@ PowerStatusView::Update(bool force)
int32 previousPercent = fPercent;
time_t previousTimeLeft = fTimeLeft;
bool wasOnline = fOnline;
bool hadBattery = fHasBattery;
_GetBatteryInfo(&fBatteryInfo, fBatteryID);
@@ -343,7 +351,6 @@ PowerStatusView::Update(bool force)
fTimeLeft = -1;
}
if (fInDeskbar) {
// make sure the tray icon is large enough
float width = fShowStatusIcon ? kMinIconWidth + 2 : 0;
@@ -396,8 +403,46 @@ PowerStatusView::Update(bool force)
if (force || wasOnline != fOnline
|| (fShowTime && fTimeLeft != previousTimeLeft)
|| (!fShowTime && fPercent != previousPercent))
|| (!fShowTime && fPercent != previousPercent)) {
Invalidate();
}
if ((hadBattery && !fHasBattery)
|| (previousPercent > kLowBatteryPercentage
&& fPercent <= kLowBatteryPercentage)) {
BBitmap* bitmap = NULL;
BResources resources;
resources.SetToImage((void*)&instantiate_deskbar_item);
if (resources.InitCheck() == B_OK) {
size_t resourceSize = 0;
const void* resourceData = resources.LoadResource(
B_VECTOR_ICON_TYPE, fHasBattery
? "battery_low" : "battery_critical", &resourceSize);
if (resourceData != NULL) {
BMemoryIO memoryIO(resourceData, resourceSize);
bitmap = BTranslationUtils::GetBitmap(&memoryIO);
}
}
BNotification notification(fHasBattery ? B_INFORMATION_NOTIFICATION
: B_ERROR_NOTIFICATION);
if (fHasBattery) {
notification.SetTitle(B_TRANSLATE("Battery low"));
notification.SetContent(B_TRANSLATE(
"The battery level is getting low, please plug the device in."));
} else {
notification.SetTitle(B_TRANSLATE("Battery critical"));
notification.SetContent(B_TRANSLATE(
"The battery level is critical, please plug the device in"
" immediately."));
}
notification.SetIcon(bitmap);
notification.Send();
delete bitmap;
}
}