Add level button and long ringtones for notifications

This commit is contained in:
Yann Diorcet 2012-09-12 18:03:58 +02:00
parent b6b43f3ff5
commit 1175e7b2a0
14 changed files with 239 additions and 12 deletions

View file

@ -23,6 +23,7 @@
#import "User.h"
#import "Network.h"
#import "History.h"
#import "LevelPushButton.h"
@protocol BuschJaegerConfigurationDelegate <NSObject>
@ -43,6 +44,7 @@ typedef enum _BuschJaegerConfigurationRequestType{
@property (readonly) NSMutableSet *users;
@property (readonly) NSMutableSet *outdoorStations;
@property (readonly) Network *network;
@property (readonly) LevelPushButton *levelPushButton;
- (void)reset;

View file

@ -27,6 +27,7 @@
@synthesize users;
@synthesize network;
@synthesize history;
@synthesize levelPushButton;
/********
[outdoorstation_0]
@ -92,6 +93,7 @@
users = [[NSMutableSet alloc] init];
history = [[NSMutableSet alloc] init];
network = [[Network alloc] init];
levelPushButton = [[LevelPushButton alloc] init];
}
return self;
}
@ -101,6 +103,7 @@
[users release];
[history release];
[network release];
[levelPushButton release];
[super dealloc];
}
@ -142,7 +145,12 @@
[network release];
}
network = [obj retain];
} else {
} else if((obj = [LevelPushButton parse:section array:array]) != nil) {
if(levelPushButton != nil) {
[levelPushButton release];
}
levelPushButton = [obj retain];
}else {
[LinphoneLogger log:LinphoneLoggerWarning format:@"Unknown section: %@", section];
}
}
@ -187,6 +195,10 @@
[network release];
}
network = [[Network alloc] init];
if(levelPushButton != nil) {
[levelPushButton release];
}
levelPushButton = [[LevelPushButton alloc] init];
}
- (BOOL)saveFile:(NSString*)file {
@ -198,6 +210,7 @@
[data appendString:[usr write]];
}
[data appendString:[network write]];
[data appendString:[levelPushButton write]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];

View file

@ -98,6 +98,12 @@ static BuschJaegerMainView* mainViewInstance=nil;
selector:@selector(callUpdateEvent:)
name:kLinphoneCallUpdate
object:nil];
// Set observer
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textReceivedEvent:)
name:kLinphoneTextReceived
object:nil];
}
- (void)vieWillDisappear:(BOOL)animated{
@ -107,6 +113,11 @@ static BuschJaegerMainView* mainViewInstance=nil;
[[NSNotificationCenter defaultCenter] removeObserver:self
name:kLinphoneCallUpdate
object:nil];
// Remove observer
[[NSNotificationCenter defaultCenter] removeObserver:self
name:kLinphoneTextReceived
object:nil];
}
@ -119,6 +130,11 @@ static BuschJaegerMainView* mainViewInstance=nil;
}
- (void)textReceivedEvent: (NSNotification*) notif {
[self displayMessage:notif];
}
#pragma mark -
- (void)callUpdate:(LinphoneCall *)call state:(LinphoneCallState)state animated:(BOOL)animated {
@ -160,13 +176,39 @@ static BuschJaegerMainView* mainViewInstance=nil;
- (void)displayIncomingCall:(LinphoneCall *)call {
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]
&& [UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
NSString *ringtone = [NSString stringWithFormat:@"%@_loop.wav", [[NSUserDefaults standardUserDefaults] stringForKey:@"ringtone_preference"], nil];
NSString *contactName = NSLocalizedString(@"Unknown", nil);
// Extract caller address
const LinphoneAddress* addr = linphone_call_get_remote_address(call);
if(addr) {
char *address = linphone_address_as_string_uri_only(addr);
if(address != NULL) {
contactName = [FastAddressBook normalizeSipURI:[NSString stringWithUTF8String:address]];
ms_free(address);
}
}
// Find caller in outdoor stations
NSSet *outstations = [[LinphoneManager instance] configuration].outdoorStations;
for(OutdoorStation *os in outstations) {
if([[FastAddressBook normalizeSipURI:os.address] isEqualToString:contactName]) {
contactName = os.name;
break;
}
}
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"%@ ring!",nil), contactName];
// Create a new notification
UILocalNotification* notif = [[[UILocalNotification alloc] init] autorelease];
if (notif) {
notif.repeatInterval = 0;
notif.alertBody = NSLocalizedString(@"Ding Dong !",nil);
notif.alertAction = @"See the answer";
notif.soundName = @"01.wav";
notif.alertBody = msg;
notif.alertAction = NSLocalizedString(@"Answer", nil);
notif.soundName = ringtone;
NSData *callData = [NSData dataWithBytes:&call length:sizeof(call)];
notif.userInfo = [NSDictionary dictionaryWithObject:callData forKey:@"call"];
@ -178,6 +220,36 @@ static BuschJaegerMainView* mainViewInstance=nil;
}
}
- (void)displayMessage:(id)message {
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"%@ ring!",nil), [LinphoneManager instance].configuration.levelPushButton.name];
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]
&& [UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
NSString *ringtone = [NSString stringWithFormat:@"%@_loop.wav", [[NSUserDefaults standardUserDefaults] stringForKey:@"level_ringtone_preference"], nil];
// Create a new notification
UILocalNotification* notif = [[[UILocalNotification alloc] init] autorelease];
if (notif) {
notif.repeatInterval = 0;
notif.alertBody = msg;
notif.alertAction = NSLocalizedString(@"Show", nil);
notif.soundName = ringtone;
[[UIApplication sharedApplication] presentLocalNotificationNow:notif];
}
} else {
UIAlertView* error = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Dring !",nil)
message:msg
delegate:nil
cancelButtonTitle:NSLocalizedString(@"Continue",nil)
otherButtonTitles:nil,nil];
[error show];
[error release];
[[LinphoneManager instance] setSpeakerEnabled:TRUE];
AudioServicesPlayAlertSound([LinphoneManager instance].sounds.level);
}
}
+ (BuschJaegerMainView *) instance {
return mainViewInstance;
}

View file

@ -172,6 +172,8 @@
@"NO", @"enable_srtp_preference",
@"YES", @"backgroundmode_preference",
@"YES", @"outbound_proxy_preference",
@"ringtone_01_1600", @"ringtone_preference",
@"ringtone_01_1600", @"level_ringtone_preference",
nil];
[defaultsToRegister addEntriesFromDictionary:appDefaults];
@ -251,8 +253,8 @@
NSDictionary *alert = [aps objectForKey:@"alert"];
if(alert != nil) {
NSString *loc_key = [alert objectForKey:@"loc-key"];
/*if we receive a remote notification, it is because our TCP background socket was no more working.
As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE*/
//if we receive a remote notification, it is because our TCP background socket was no more working.
//As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE
LinphoneCore *lc = [LinphoneManager getLc];
linphone_core_set_network_reachable(lc, FALSE);
linphone_core_set_network_reachable(lc, TRUE);

View file

@ -464,6 +464,14 @@ static void linphone_iphone_registration_state(LinphoneCore *lc, LinphoneProxyCo
[[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneTextReceived object:self userInfo:dict];
[chat release];
*/
// Post event
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSValue valueWithPointer:room], @"room",
[NSValue valueWithPointer:from], @"from",
[NSString stringWithUTF8String:message], @"message",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneTextReceived object:self userInfo:dict];
}
static void linphone_iphone_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message) {
@ -1330,9 +1338,6 @@ static void audioRouteChangeListenerCallback (
}
{
NSString *ringtone = [[NSUserDefaults standardUserDefaults] stringForKey:@"ringtone_preference"];
if(ringtone == nil) {
ringtone = @"ringtone_01_1600";
}
NSString *path = [[NSBundle mainBundle] pathForResource:ringtone ofType:@"wav"];
sounds.call = 0;
OSStatus status = AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &sounds.call);
@ -1345,9 +1350,6 @@ static void audioRouteChangeListenerCallback (
}
{
NSString *ringtone = [[NSUserDefaults standardUserDefaults] stringForKey:@"level_ringtone_preference"];
if(ringtone == nil) {
ringtone = @"ringtone_01_1600";
}
NSString *path = [[NSBundle mainBundle] pathForResource:ringtone ofType:@"wav"];
sounds.level = 0;
OSStatus status = AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &sounds.level);

View file

@ -0,0 +1,29 @@
/* LevelPushButton.h
*
* Copyright (C) 2012 Belledonne Comunications, Grenoble, France
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import <Foundation/Foundation.h>
@interface LevelPushButton : NSObject
@property (copy) NSString* name;
- (NSString*)write;
+ (id)parse:(NSString*)section array:(NSArray*)array;
@end

View file

@ -0,0 +1,59 @@
/* LevelPushButton.m
*
* Copyright (C) 2012 Belledonne Comunications, Grenoble, France
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "LevelPushButton.h"
#import "BuschJaegerConfiguration.h"
#import "Utils.h"
@implementation LevelPushButton
@synthesize name;
- (void)dealloc {
[name release];
[super dealloc];
}
- (NSString*)write {
NSMutableString *str = [NSMutableString string];
[str appendString:[NSString stringWithFormat:@"\n[levelpushbutton]\n"]];
[str appendString:[NSString stringWithFormat:@"name=%@\n", name]];
return str;
}
+ (id)parse:(NSString*)section array:(NSArray*)array {
NSString *param;
LevelPushButton *net = nil;
if((param = [BuschJaegerConfiguration getRegexValue:@"^\\[(levelpushbutton)\\]$" data:section]) != nil) {
net = [[[LevelPushButton alloc] init] autorelease];
NSString *param;
for(NSString *entry in array) {
if((param = [BuschJaegerConfiguration getRegexValue:@"^name=(.*)$" data:entry]) != nil) {
net.name = param;
} else if([[entry stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] != 0){
[LinphoneLogger log:LinphoneLoggerWarning format:@"Unknown entry in %@ section: %@", section, entry];
}
}
}
return net;
}
@end

View file

@ -41,6 +41,16 @@
global-history=http://welcome.dyndns.org:8080/history.ini
*/
- (void)dealloc {
[domain release];
[localAddress release];
[globalAddress release];
[localHistory release];
[globalHistory release];
[super dealloc];
}
- (NSString*)write {
NSMutableString *str = [NSMutableString string];
[str appendString:[NSString stringWithFormat:@"\n[network]\n"]];

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -126,6 +126,18 @@
D32B6E2F15A5C0AC0033019F /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */; };
D32B9DFC15A2F131000B6DEC /* FastAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */; };
D32B9DFD15A2F131000B6DEC /* FastAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */; };
D32EDD9B1600C450009A84C7 /* LevelPushButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D32EDD9A1600C450009A84C7 /* LevelPushButton.m */; };
D32EDD9C1600C450009A84C7 /* LevelPushButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D32EDD9A1600C450009A84C7 /* LevelPushButton.m */; };
D32EDDA31600C8FC009A84C7 /* ringtone_01_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDD9E1600C8FC009A84C7 /* ringtone_01_1600_loop.wav */; };
D32EDDA41600C8FC009A84C7 /* ringtone_01_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDD9E1600C8FC009A84C7 /* ringtone_01_1600_loop.wav */; };
D32EDDA51600C8FC009A84C7 /* ringtone_02_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDD9F1600C8FC009A84C7 /* ringtone_02_1600_loop.wav */; };
D32EDDA61600C8FC009A84C7 /* ringtone_02_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDD9F1600C8FC009A84C7 /* ringtone_02_1600_loop.wav */; };
D32EDDA71600C8FC009A84C7 /* ringtone_03_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDDA01600C8FC009A84C7 /* ringtone_03_1600_loop.wav */; };
D32EDDA81600C8FC009A84C7 /* ringtone_03_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDDA01600C8FC009A84C7 /* ringtone_03_1600_loop.wav */; };
D32EDDA91600C8FC009A84C7 /* ringtone_04_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDDA11600C8FC009A84C7 /* ringtone_04_1600_loop.wav */; };
D32EDDAA1600C8FC009A84C7 /* ringtone_04_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDDA11600C8FC009A84C7 /* ringtone_04_1600_loop.wav */; };
D32EDDAB1600C8FC009A84C7 /* ringtone_05_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDDA21600C8FC009A84C7 /* ringtone_05_1600_loop.wav */; };
D32EDDAC1600C8FC009A84C7 /* ringtone_05_1600_loop.wav in Resources */ = {isa = PBXBuildFile; fileRef = D32EDDA21600C8FC009A84C7 /* ringtone_05_1600_loop.wav */; };
D33BEE1F15FF711B004ED2AF /* linphonerc-factory in Resources */ = {isa = PBXBuildFile; fileRef = D33BEE1C15FF711B004ED2AF /* linphonerc-factory */; };
D33BEE2015FF711B004ED2AF /* linphonerc-factory in Resources */ = {isa = PBXBuildFile; fileRef = D33BEE1C15FF711B004ED2AF /* linphonerc-factory */; };
D33BEE2115FF711B004ED2AF /* linphonerc-factory~ipad in Resources */ = {isa = PBXBuildFile; fileRef = D33BEE1D15FF711B004ED2AF /* linphonerc-factory~ipad */; };
@ -579,6 +591,13 @@
D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FastAddressBook.h; path = Utils/FastAddressBook.h; sourceTree = "<group>"; };
D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FastAddressBook.m; path = Utils/FastAddressBook.m; sourceTree = "<group>"; };
D32EDD991600C450009A84C7 /* LevelPushButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LevelPushButton.h; path = Model/LevelPushButton.h; sourceTree = "<group>"; };
D32EDD9A1600C450009A84C7 /* LevelPushButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LevelPushButton.m; path = Model/LevelPushButton.m; sourceTree = "<group>"; };
D32EDD9E1600C8FC009A84C7 /* ringtone_01_1600_loop.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringtone_01_1600_loop.wav; path = Resources/ringtone_01_1600_loop.wav; sourceTree = "<group>"; };
D32EDD9F1600C8FC009A84C7 /* ringtone_02_1600_loop.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringtone_02_1600_loop.wav; path = Resources/ringtone_02_1600_loop.wav; sourceTree = "<group>"; };
D32EDDA01600C8FC009A84C7 /* ringtone_03_1600_loop.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringtone_03_1600_loop.wav; path = Resources/ringtone_03_1600_loop.wav; sourceTree = "<group>"; };
D32EDDA11600C8FC009A84C7 /* ringtone_04_1600_loop.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringtone_04_1600_loop.wav; path = Resources/ringtone_04_1600_loop.wav; sourceTree = "<group>"; };
D32EDDA21600C8FC009A84C7 /* ringtone_05_1600_loop.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringtone_05_1600_loop.wav; path = Resources/ringtone_05_1600_loop.wav; sourceTree = "<group>"; };
D33BEE1C15FF711B004ED2AF /* linphonerc-factory */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "linphonerc-factory"; path = "Resources/linphonerc-factory"; sourceTree = "<group>"; };
D33BEE1D15FF711B004ED2AF /* linphonerc-factory~ipad */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "linphonerc-factory~ipad"; path = "Resources/linphonerc-factory~ipad"; sourceTree = "<group>"; };
D33BEE1E15FF711B004ED2AF /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = "<group>"; };
@ -1289,10 +1308,15 @@
D33BEE1D15FF711B004ED2AF /* linphonerc-factory~ipad */,
D321FF9815E628CB0098B5F4 /* linphonerc~ipad */,
D376EAE316008454007C8226 /* ringtone_01_1600.wav */,
D32EDD9E1600C8FC009A84C7 /* ringtone_01_1600_loop.wav */,
D376EAE416008454007C8226 /* ringtone_02_1600.wav */,
D32EDD9F1600C8FC009A84C7 /* ringtone_02_1600_loop.wav */,
D376EAE516008454007C8226 /* ringtone_03_1600.wav */,
D32EDDA01600C8FC009A84C7 /* ringtone_03_1600_loop.wav */,
D376EAE616008454007C8226 /* ringtone_04_1600.wav */,
D32EDDA11600C8FC009A84C7 /* ringtone_04_1600_loop.wav */,
D376EAE716008454007C8226 /* ringtone_05_1600.wav */,
D32EDDA21600C8FC009A84C7 /* ringtone_05_1600_loop.wav */,
D33BEE1E15FF711B004ED2AF /* rootca.pem */,
D376EAF716009E2A007C8226 /* snapshot.png */,
D376EAE0160082A4007C8226 /* trash.png */,
@ -1333,6 +1357,8 @@
children = (
D384468715E65CFE00DF89DF /* History.h */,
D384468815E65CFE00DF89DF /* History.m */,
D32EDD991600C450009A84C7 /* LevelPushButton.h */,
D32EDD9A1600C450009A84C7 /* LevelPushButton.m */,
D383A44C15E3C98C00CDE5C9 /* Network.h */,
D383A44D15E3C98C00CDE5C9 /* Network.m */,
D37CD35115E22A470028869A /* OutdoorStation.h */,
@ -1548,6 +1574,11 @@
D376EAF016008454007C8226 /* ringtone_05_1600.wav in Resources */,
D376EAF816009E2A007C8226 /* bj_save.png in Resources */,
D376EAFA16009E2A007C8226 /* snapshot.png in Resources */,
D32EDDA31600C8FC009A84C7 /* ringtone_01_1600_loop.wav in Resources */,
D32EDDA51600C8FC009A84C7 /* ringtone_02_1600_loop.wav in Resources */,
D32EDDA71600C8FC009A84C7 /* ringtone_03_1600_loop.wav in Resources */,
D32EDDA91600C8FC009A84C7 /* ringtone_04_1600_loop.wav in Resources */,
D32EDDAB1600C8FC009A84C7 /* ringtone_05_1600_loop.wav in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1602,6 +1633,11 @@
D376EAF116008454007C8226 /* ringtone_05_1600.wav in Resources */,
D376EAF916009E2A007C8226 /* bj_save.png in Resources */,
D376EAFB16009E2A007C8226 /* snapshot.png in Resources */,
D32EDDA41600C8FC009A84C7 /* ringtone_01_1600_loop.wav in Resources */,
D32EDDA61600C8FC009A84C7 /* ringtone_02_1600_loop.wav in Resources */,
D32EDDA81600C8FC009A84C7 /* ringtone_03_1600_loop.wav in Resources */,
D32EDDAA1600C8FC009A84C7 /* ringtone_04_1600_loop.wav in Resources */,
D32EDDAC1600C8FC009A84C7 /* ringtone_05_1600_loop.wav in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1687,6 +1723,7 @@
D3FE9F4415E78D720024F3E4 /* BuschJaegerHistoryDetailsView.m in Sources */,
D3FE9F4B15E790D80024F3E4 /* UIHistoryDetailsCell.m in Sources */,
D376EAF416008DF1007C8226 /* User.m in Sources */,
D32EDD9B1600C450009A84C7 /* LevelPushButton.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1740,6 +1777,7 @@
D3FE9F4515E78D720024F3E4 /* BuschJaegerHistoryDetailsView.m in Sources */,
D3FE9F4C15E790D80024F3E4 /* UIHistoryDetailsCell.m in Sources */,
D376EAF516008DF1007C8226 /* User.m in Sources */,
D32EDD9C1600C450009A84C7 /* LevelPushButton.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};