Notify the user (once) if during a video call the battery level goes below 10%

This commit is contained in:
Pierre-Eric Pelloux-Prayer 2012-03-27 16:43:01 +02:00
parent e0c46d1ba7
commit bbc4e348f1
5 changed files with 64 additions and 2 deletions

View file

@ -24,7 +24,8 @@ enum CallDelegateType {
CD_UNDEFINED = 0,
CD_NEW_CALL,
CD_ZRTP,
CD_VIDEO_UPDATE
CD_VIDEO_UPDATE,
CD_STOP_VIDEO_ON_LOW_BATTERY
};
@protocol UIActionSheetCustomDelegate

View file

@ -207,6 +207,38 @@ void addAnimationFadeTransition(UIView* view, float duration) {
hideControlsTimer = nil;
}
-(void) batteryLevelChanged: (NSNotification*) notif {
LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]);
if (!call || !linphone_call_params_video_enabled(linphone_call_get_current_params(call)))
return;
LinphoneCallAppData* appData = (LinphoneCallAppData*) linphone_call_get_user_pointer(call);
if ([UIDevice currentDevice].batteryState == UIDeviceBatteryStateUnplugged) {
float level = [UIDevice currentDevice].batteryLevel;
ms_message("Video call is running. Battery level: %.2f", level);
if (level < 0.1 && !appData->batteryWarningShown) {
// notify user
CallDelegate* cd = [[CallDelegate alloc] init];
cd.eventType = CD_STOP_VIDEO_ON_LOW_BATTERY;
cd.delegate = self;
cd.call = call;
if (visibleActionSheet != nil) {
[visibleActionSheet dismissWithClickedButtonIndex:visibleActionSheet.cancelButtonIndex animated:TRUE];
}
NSString* title = NSLocalizedString(@"Battery is running low. Stop video ?",nil);
visibleActionSheet = [[UIActionSheet alloc] initWithTitle:title
delegate:cd
cancelButtonTitle:NSLocalizedString(@"Continue video",nil)
destructiveButtonTitle:NSLocalizedString(@"Stop video",nil)
otherButtonTitles:nil];
visibleActionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[visibleActionSheet showInView:self.view];
appData->batteryWarningShown = TRUE;
}
}
}
-(void) enableVideoDisplay {
[self orientationChanged:nil];
@ -233,6 +265,8 @@ void addAnimationFadeTransition(UIView* view, float duration) {
NSLog(@"new center: %f %f", videoView.center.x, videoView.center.y);
done = true;
}
[self batteryLevelChanged:nil];
}
-(void) disableVideoDisplay {
@ -392,7 +426,9 @@ void addAnimationFadeTransition(UIView* view, float duration) {
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
[videoCameraSwitch setPreview:videoPreview];
addVideo.videoUpdateIndicator = videoUpdateIndicator;
@ -976,6 +1012,16 @@ void addAnimationFadeTransition(UIView* view, float duration) {
visibleActionSheet = nil;
break;
}
case CD_STOP_VIDEO_ON_LOW_BATTERY: {
LinphoneCall* call = (LinphoneCall*)datas;
LinphoneCallParams* paramsCopy = linphone_call_params_copy(linphone_call_get_current_params(call));
if ([visibleActionSheet destructiveButtonIndex] == buttonIndex) {
// stop video
linphone_call_params_enable_video(paramsCopy, FALSE);
linphone_core_update_call([LinphoneManager getLc], call, paramsCopy);
}
break;
}
default:
ms_error("Unhandled CallDelegate event of type: %d received - ignoring", type);
}

View file

@ -207,6 +207,8 @@ int __aeabi_idiv(int a, int b) {
[window makeKeyAndVisible];
[[LinphoneManager instance] setCallDelegate:myPhoneViewController];
[UIDevice currentDevice].batteryMonitoringEnabled = YES;
}
-(void) setupGSMInteraction {

View file

@ -42,6 +42,10 @@ struct NetworkReachabilityContext {
void (*networkStateChanged) (Connectivity newConnectivity);
};
typedef struct _LinphoneCallAppData {
bool_t batteryWarningShown;
} LinphoneCallAppData;
@interface LinphoneManager : NSObject <AVAudioSessionDelegate> {
@protected

View file

@ -150,6 +150,12 @@ extern void libmsbcg729_init();
bool canHideInCallView = (linphone_core_get_calls([LinphoneManager getLc]) == NULL);
if (!linphone_call_get_user_pointer(call)) {
LinphoneCallAppData* data = (LinphoneCallAppData*) malloc(sizeof(LinphoneCallAppData));
data->batteryWarningShown = FALSE;
linphone_call_set_user_pointer(call, data);
}
switch (new_state) {
case LinphoneCallIncomingReceived:
[callDelegate displayIncomingCall:call
@ -262,6 +268,9 @@ extern void libmsbcg729_init();
[callDelegate displayInCall:call FromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName];
}
break;
case LinphoneCallReleased:
free (linphone_call_get_user_pointer(call));
break;
default:
break;
}