Add Image in chat

This commit is contained in:
Yann Diorcet 2012-09-18 16:52:52 +02:00
parent c83b75f4ba
commit 4accca8b3a
24 changed files with 564 additions and 203 deletions

View file

@ -21,12 +21,20 @@
#import <UIKit/UIKit.h>
#import "ChatModel.h"
@protocol ChatRoomDelegate <NSObject>
- (BOOL)chatRoomStartImageDownload:(NSURL*)url userInfo:(id)userInfo;
- (BOOL)chatRoomStartImageUpload:(UIImage*)image url:(NSURL*)url;
@end
@interface ChatRoomTableViewController : UITableViewController {
@private
NSMutableArray *data;
}
@property (nonatomic, copy) NSString *remoteAddress;
@property (nonatomic, retain) id<ChatRoomDelegate> chatRoomDelegate;
- (void)addChatEntry:(ChatModel*)chat;
- (void)updateChatEntry:(ChatModel*)chat;

View file

@ -21,15 +21,25 @@
#import "ChatRoomTableViewController.h"
#import "UIChatRoomCell.h"
#import "Utils.h"
#import "PhoneMainView.h"
#import <NinePatch.h>
@implementation ChatRoomTableViewController
@synthesize remoteAddress;
@synthesize chatRoomDelegate;
#pragma mark - Lifecycle Functions
#pragma mark - ViewController
- (void)dealloc {
[remoteAddress release];
[chatRoomDelegate release];
[super dealloc];
}
#pragma mark - ViewController Functions
- (void)viewDidLoad {
[super viewDidLoad];
@ -73,6 +83,7 @@
[self.tableView endUpdates];
[self scrollToLastUnread:true];
}
- (void)updateChatEntry:(ChatModel*)chat {
if(data == nil) {
[LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot update entry: null data"];
@ -86,6 +97,7 @@
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:FALSE];; //just reload
return;
}
- (void)scrollToLastUnread:(BOOL)animated {
if(data == nil) {
[LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot add entry: null data"];
@ -145,7 +157,7 @@
}
[cell setChat:[data objectAtIndex:[indexPath row]]];
[cell setChatRoomDelegate:chatRoomDelegate];
return cell;
}

View file

@ -18,7 +18,6 @@
*/
#import <UIKit/UIKit.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import "UIToggleButton.h"
#import "UICompositeViewController.h"
@ -30,14 +29,11 @@
#include "linphonecore.h"
@interface ChatRoomViewController : UIViewController<HPGrowingTextViewDelegate, UICompositeViewDelegate, ImagePickerDelegate, ImageSharingDelegate> {
@private
@interface ChatRoomViewController : UIViewController<HPGrowingTextViewDelegate, UICompositeViewDelegate, ImagePickerDelegate, ImageSharingDelegate, ChatRoomDelegate> {
LinphoneChatRoom *chatRoom;
ImageSharing *imageSharing;
ALAssetsLibrary *photoLibrary;
}
@property (nonatomic, retain) IBOutlet ChatRoomTableViewController* tableController;
@property (nonatomic, retain) IBOutlet UIToggleButton *editButton;
@property (nonatomic, retain) IBOutlet HPGrowingTextView* messageField;
@ -50,6 +46,7 @@
@property (nonatomic, retain) IBOutlet UIView *messageView;
@property (nonatomic, retain) IBOutlet UIImageView *messageBackgroundImage;
@property (nonatomic, retain) IBOutlet UIImageView *footerBackgroundImage;
@property (nonatomic, retain) IBOutlet UIImageView *transferBackgroundImage;
@property (nonatomic, retain) IBOutlet UITapGestureRecognizer *listTapGestureRecognizer;
@property (nonatomic, copy) NSString *remoteAddress;

View file

@ -22,7 +22,7 @@
#import "DTActionSheet.h"
#import <NinePatch.h>
#import <MobileCoreServices/UTCoreTypes.h>
@implementation ChatRoomViewController
@ -39,6 +39,7 @@
@synthesize messageView;
@synthesize messageBackgroundImage;
@synthesize footerBackgroundImage;
@synthesize transferBackgroundImage;
@synthesize listTapGestureRecognizer;
@synthesize pictureButton;
@synthesize imageTransferProgressBar;
@ -53,7 +54,6 @@
if (self != nil) {
self->chatRoom = NULL;
self->imageSharing = NULL;
self->photoLibrary = [[ALAssetsLibrary alloc] init];
}
return self;
}
@ -72,6 +72,7 @@
[messageView release];
[messageBackgroundImage release];
[footerBackgroundImage release];
[transferBackgroundImage release];
[listTapGestureRecognizer release];
@ -80,8 +81,6 @@
[imageTransferProgressBar release];
[cancelTransferButton release];
[photoLibrary release];
[super dealloc];
}
@ -110,6 +109,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)viewDidLoad {
[super viewDidLoad];
[tableController setChatRoomDelegate:self];
// Set selected+over background: IB lack !
[editButton setImage:[UIImage imageNamed:@"chat_ok_over.png"]
@ -122,6 +122,7 @@ static UICompositeViewDescription *compositeDescription = nil;
messageField.contentInset = UIEdgeInsetsZero;
messageField.backgroundColor = [UIColor clearColor];
[sendButton setEnabled:FALSE];
[listTapGestureRecognizer setEnabled:FALSE];
}
@ -150,9 +151,11 @@ static UICompositeViewDescription *compositeDescription = nil;
[messageBackgroundImage setImage:[TUNinePatchCache imageOfSize:[messageBackgroundImage bounds].size
forNinePatchNamed:@"chat_field"]];
[footerBackgroundImage setImage:[TUNinePatchCache imageOfSize:[footerBackgroundImage bounds].size
forNinePatchNamed:@"chat_background"]];
[transferBackgroundImage setImage:[TUNinePatchCache imageOfSize:[transferBackgroundImage bounds].size
forNinePatchNamed:@"chat_background"]];
BOOL fileSharingEnabled = [[LinphoneManager instance] lpConfigStringForKey:@"file_upload_url_preference"] != NULL
&& [[[LinphoneManager instance] lpConfigStringForKey:@"file_upload_url_preference"] length]>0;
@ -273,7 +276,7 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
[thiz.tableController updateChatEntry:chat];
}
- (BOOL)sendMessage:(NSString *)message withExterlBodyUrl:(NSString*) url{
- (BOOL)sendMessage:(NSString *)message withExterlBodyUrl:(NSURL*)externalUrl withInternalUrl:(NSURL*)internalUrl {
if(![LinphoneManager isLcReady]) {
[LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot send message: Linphone core not ready"];
return FALSE;
@ -290,7 +293,11 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
ChatModel *chat = [[ChatModel alloc] init];
[chat setRemoteContact:remoteAddress];
[chat setLocalContact:@""];
[chat setMessage:message];
if(internalUrl == nil) {
[chat setMessage:message];
} else {
[chat setMessage:[internalUrl absoluteString]];
}
[chat setDirection:[NSNumber numberWithInt:0]];
[chat setTime:[NSDate date]];
[chat setRead:[NSNumber numberWithInt:1]];
@ -301,9 +308,9 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
LinphoneChatMessage* msg = linphone_chat_room_create_message(chatRoom, [message UTF8String]);
linphone_chat_message_set_user_data(msg, chat);
if (url) {
linphone_chat_message_set_external_body_url(msg, [url UTF8String]);
}
if(externalUrl) {
linphone_chat_message_set_external_body_url(msg, [[externalUrl absoluteString] UTF8String]);
}
linphone_chat_room_send_message2(chatRoom, msg, message_status, self);
return TRUE;
}
@ -329,19 +336,6 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
}
ms_free(fromStr);
}
if ([[notif userInfo] objectForKey:@"external_body_url"]) {
NSString *pendingFileUrl = [[[notif userInfo] objectForKey:@"external_body_url"] retain];
DTActionSheet *sheet = [[[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Incoming file stored to your photo library",nil)] autorelease];
[sheet addButtonWithTitle:NSLocalizedString(@"Accept",nil) block:^(){
imageSharing = [ImageSharing imageSharingDownload:[NSURL URLWithString:pendingFileUrl] delegate:self];
[footerView setHidden:TRUE];
[transferView setHidden:FALSE];
}];
[sheet addCancelButtonWithTitle:NSLocalizedString(@"Ignore",nil)];
[sheet showInView:[PhoneMainView instance].view];
}
} else {
[LinphoneLogger logc:LinphoneLoggerWarning format:"Invalid textReceivedEvent"];
}
@ -354,8 +348,13 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
if(editButton.selected) {
[tableController setEditing:FALSE animated:TRUE];
[editButton setOff];
[listTapGestureRecognizer setEnabled:TRUE];
}
[listTapGestureRecognizer setEnabled:TRUE];
return TRUE;
}
- (BOOL)growingTextViewShouldEndEditing:(HPGrowingTextView *)growingTextView {
[listTapGestureRecognizer setEnabled:FALSE];
return TRUE;
}
@ -391,13 +390,12 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
}
- (IBAction)onEditClick:(id)event {
[listTapGestureRecognizer setEnabled:[tableController isEditing]];
[tableController setEditing:![tableController isEditing] animated:TRUE];
[messageField resignFirstResponder];
}
- (IBAction)onSendClick:(id)event {
if([self sendMessage:[messageField text] withExterlBodyUrl:nil]) {
if([self sendMessage:[messageField text] withExterlBodyUrl:nil withInternalUrl:nil]) {
[messageField setText:@""];
[self onMessageChange:nil];
}
@ -428,7 +426,7 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
// Displays a control that allows the user to choose picture or
// movie capture, if both are available:
controller.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:type];
controller.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
// Hides the controls for moving & scaling pictures, or for
// trimming movies. To instead show the controls, use YES.
@ -445,6 +443,30 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
}
#pragma mark ChatRoomDelegate
- (BOOL)chatRoomStartImageDownload:(NSURL*)url userInfo:(id)userInfo {
if(imageSharing == nil) {
imageSharing = [ImageSharing imageSharingDownload:url delegate:self userInfo:userInfo];
[footerView setHidden:TRUE];
[transferView setHidden:FALSE];
return TRUE;
}
return FALSE;
}
- (BOOL)chatRoomStartImageUpload:(UIImage*)image url:(NSURL*)url{
if(imageSharing == nil) {
NSString *urlString = [[LinphoneManager instance] lpConfigStringForKey:@"file_upload_url_preference"];
imageSharing = [ImageSharing imageSharingUpload:[NSURL URLWithString:urlString] image:image delegate:self userInfo:url];
[footerView setHidden:TRUE];
[transferView setHidden:FALSE];
return TRUE;
}
return FALSE;
}
#pragma mark ImageSharingDelegate
- (void)imageSharingProgress:(ImageSharing*)aimageSharing progress:(float)progress {
@ -486,7 +508,9 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
}
- (void)imageSharingUploadDone:(ImageSharing*)aimageSharing url:(NSURL*)url{
[self sendMessage:NSLocalizedString(@"Image sent", nil) withExterlBodyUrl:[url absoluteString]];
NSURL *imageURL = [aimageSharing userInfo];
[self sendMessage:nil withExterlBodyUrl:url withInternalUrl:imageURL];
[footerView setHidden:FALSE];
[transferView setHidden:TRUE];
@ -497,30 +521,59 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta
[footerView setHidden:FALSE];
[transferView setHidden:TRUE];
[photoLibrary writeImageToSavedPhotosAlbum:(CGImageRef)image
metadata:nil
completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
[LinphoneLogger log:LinphoneLoggerError format:@"Cannot save image data downloaded [%@]",[error localizedDescription]];
} else {
[LinphoneLogger log:LinphoneLoggerLog format:@"Image saved to [%@]",[assetURL absoluteString]];
}
ImageViewController *controller = DYNAMIC_CAST([[PhoneMainView instance] changeCurrentView:[ImageViewController compositeViewDescription] push:TRUE], ImageViewController);
if(controller != nil) {
[controller setImage:image];
}
}];
ChatModel *chat = (ChatModel *)[imageSharing userInfo];
[[LinphoneManager instance].photoLibrary writeImageToSavedPhotosAlbum:image.CGImage
metadata:nil
completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
[LinphoneLogger log:LinphoneLoggerError format:@"Cannot save image data downloaded [%@]", [error localizedDescription]];
UIAlertView* errorAlert = [UIAlertView alloc];
[errorAlert initWithTitle:NSLocalizedString(@"Transfer error", nil)
message:NSLocalizedString(@"Cannot write image to photo library", nil)
delegate:nil
cancelButtonTitle:NSLocalizedString(@"Ok",nil)
otherButtonTitles:nil ,nil];
[errorAlert show];
[errorAlert release];
return;
}
[LinphoneLogger log:LinphoneLoggerLog format:@"Image saved to [%@]", [assetURL absoluteString]];
[chat setMessage:[assetURL absoluteString]];
[chat update];
[tableController updateChatEntry:chat];
}];
imageSharing = NULL;
}
#pragma mark ImagePickerDelegate
- (void)imagePickerDelegateImage:(UIImage*)image {
NSString *urlString = [[LinphoneManager instance] lpConfigStringForKey:@"file_upload_url_preference"];
imageSharing = [ImageSharing imageSharingUpload:[NSURL URLWithString:urlString] image:image delegate:self];
[footerView setHidden:TRUE];
[transferView setHidden:FALSE];
- (void)imagePickerDelegateImage:(UIImage*)image info:(NSDictionary *)info {
NSURL *url = [info valueForKey:UIImagePickerControllerReferenceURL];
if(url != nil) {
[self chatRoomStartImageUpload:image url:url];
} else {
[[LinphoneManager instance].photoLibrary writeImageToSavedPhotosAlbum:image.CGImage
metadata:nil
completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
[LinphoneLogger log:LinphoneLoggerError format:@"Cannot save image data downloaded [%@]", [error localizedDescription]];
UIAlertView* errorAlert = [UIAlertView alloc];
[errorAlert initWithTitle:NSLocalizedString(@"Transfer error", nil)
message:NSLocalizedString(@"Cannot write image to photo library", nil)
delegate:nil
cancelButtonTitle:NSLocalizedString(@"Ok",nil)
otherButtonTitles:nil ,nil];
[errorAlert show];
[errorAlert release];
return;
}
[LinphoneLogger log:LinphoneLoggerLog format:@"Image saved to [%@]", [assetURL absoluteString]];
[self chatRoomStartImageUpload:image url:assetURL];
}];
}
}

View file

@ -21,14 +21,20 @@
@protocol ImagePickerDelegate <NSObject>
- (void)imagePickerDelegateImage:(UIImage*)image;
- (void)imagePickerDelegateImage:(UIImage*)image info:(NSDictionary *)info;
@end
@interface ImagePickerViewController : UIImagePickerController <UICompositeViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
@interface ImagePickerViewController : UIViewController <UICompositeViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIPopoverControllerDelegate> {
@private
UIImagePickerController *pickerController;
UIPopoverController *popoverController;
}
@property (nonatomic, retain) id<ImagePickerDelegate> imagePickerDelegate;
@property(nonatomic, retain) id<ImagePickerDelegate> imagePickerDelegate;
@property(nonatomic) UIImagePickerControllerSourceType sourceType;
@property(nonatomic,copy) NSArray *mediaTypes;
@property(nonatomic) BOOL allowsEditing;
+ (void)promptSelectSource:(void (^)(UIImagePickerControllerSourceType))block;

View file

@ -24,6 +24,30 @@
@implementation ImagePickerViewController
@synthesize imagePickerDelegate;
@synthesize sourceType;
@synthesize mediaTypes;
@synthesize allowsEditing;
#pragma mark - Lifecycle Functions
- (id)init {
self = [super init];
if (self != nil) {
pickerController = [[UIImagePickerController alloc] init];
if([LinphoneManager runningOnIpad]) {
popoverController = [[UIPopoverController alloc] initWithContentViewController:pickerController];
}
}
return self;
}
- (void)dealloc {
[pickerController release];
[popoverController release];
[super dealloc];
}
#pragma mark - UICompositeViewDelegate Functions
@ -50,7 +74,55 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)viewDidLoad {
[super viewDidLoad];
[self setDelegate:self];
[self.view setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
if(popoverController == nil) {
[pickerController.view setFrame:[self.view bounds]];
[self.view addSubview:[pickerController view]];
} else {
[popoverController setDelegate:self];
}
[pickerController setDelegate:self];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(popoverController != nil) {
[popoverController presentPopoverFromRect:CGRectZero inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:FALSE];
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if(popoverController != nil) {
[popoverController dismissPopoverAnimated: NO];
}
}
#pragma mark - Property Functions
- (BOOL)allowsEditing {
return pickerController.allowsEditing;
}
- (void)setAllowsEditing:(BOOL)aallowsEditing {
pickerController.allowsEditing = aallowsEditing;
}
- (UIImagePickerControllerSourceType)sourceType {
return pickerController.sourceType;
}
- (void)setSourceType:(UIImagePickerControllerSourceType)asourceType {
pickerController.sourceType = asourceType;
}
- (NSArray *)mediaTypes {
return pickerController.mediaTypes;
}
- (void)setMediaTypes:(NSArray *)amediaTypes {
pickerController.mediaTypes = amediaTypes;
}
@ -88,7 +160,7 @@ static UICompositeViewDescription *compositeDescription = nil;
image = [info objectForKey:UIImagePickerControllerOriginalImage];
}
if(image != nil && imagePickerDelegate != nil) {
[imagePickerDelegate imagePickerDelegateImage:image];
[imagePickerDelegate imagePickerDelegateImage:image info:info];
}
[self dismiss];
}
@ -97,4 +169,9 @@ static UICompositeViewDescription *compositeDescription = nil;
[self dismiss];
}
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)apopoverController {
[self dismiss];
return TRUE;
}
@end

View file

@ -38,11 +38,13 @@
int statusCode;
}
+ (id)imageSharingUpload:(NSURL*)url image:(UIImage*)image delegate:(id<ImageSharingDelegate>)delegate;
+ (id)imageSharingDownload:(NSURL*)url delegate:(id<ImageSharingDelegate>)delegate;
+ (id)imageSharingUpload:(NSURL*)url image:(UIImage*)image delegate:(id<ImageSharingDelegate>)delegate userInfo:(id)userInfo;
+ (id)imageSharingDownload:(NSURL*)url delegate:(id<ImageSharingDelegate>)delegate userInfo:(id)userInfo;
- (void)cancel;
@property (nonatomic, retain) id userInfo;
@property (nonatomic, readonly) BOOL upload;
@property (nonatomic, readonly) NSMutableData* data;
@property (nonatomic, readonly) NSURLConnection* connection;

View file

@ -26,13 +26,14 @@
@synthesize connection;
@synthesize data;
@synthesize upload;
@synthesize userInfo;
#pragma mark - Lifecycle Functions
+ (id)imageSharingUpload:(NSURL*)url image:(UIImage*)image delegate:(id<ImageSharingDelegate>)delegate {
+ (id)imageSharingUpload:(NSURL*)url image:(UIImage*)image delegate:(id<ImageSharingDelegate>)delegate userInfo:(id)auserInfo{
ImageSharing *imgs = [[ImageSharing alloc] init];
if(imgs != nil) {
imgs.userInfo = auserInfo;
imgs->upload = TRUE;
imgs->delegate = [delegate retain];
imgs->data = [[NSMutableData alloc] init];
@ -44,9 +45,10 @@
return imgs;
}
+ (id)imageSharingDownload:(NSURL*)url delegate:(id<ImageSharingDelegate>)delegate {
+ (id)imageSharingDownload:(NSURL*)url delegate:(id<ImageSharingDelegate>)delegate userInfo:(id)auserInfo{
ImageSharing *imgs = [[ImageSharing alloc] init];
if(imgs != nil) {
imgs.userInfo = auserInfo;
imgs->upload = FALSE;
imgs->delegate = [delegate retain];
imgs->data = [[NSMutableData alloc] init];
@ -62,6 +64,7 @@
[connection release];
[data release];
[delegate release];
[userInfo release];
[super dealloc];
}

View file

@ -21,6 +21,8 @@
#import <AVFoundation/AVAudioSession.h>
#import <SystemConfiguration/SCNetworkReachability.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import <sqlite3.h>
#import "IASKSettingsReader.h"
@ -140,6 +142,7 @@ typedef struct _LinphoneManagerSounds {
@property (readonly) LinphoneManagerSounds sounds;
@property (readonly) NSMutableArray *logs;
@property (nonatomic, assign) BOOL speakerEnabled;
@property (readonly) ALAssetsLibrary *photoLibrary;
@end

View file

@ -87,6 +87,7 @@ extern void libmsbcg729_init();
@synthesize sounds;
@synthesize logs;
@synthesize speakerEnabled;
@synthesize photoLibrary;
struct codec_name_pref_table{
const char *name;
@ -218,6 +219,7 @@ struct codec_name_pref_table codec_pref_table[]={
[self openDatabase];
[self copyDefaultSettings];
lastRemoteNotificationTime=0;
photoLibrary = [[ALAssetsLibrary alloc] init];
}
return self;
}
@ -239,6 +241,7 @@ struct codec_name_pref_table codec_pref_table[]={
[LinphoneLogger logc:LinphoneLoggerError format:"cannot un register route change handler [%ld]", lStatus];
}
[photoLibrary release];
[super dealloc];
}
@ -433,7 +436,7 @@ static void linphone_iphone_registration_state(LinphoneCore *lc, LinphoneProxyCo
[chat setLocalContact:@""];
[chat setRemoteContact:[NSString stringWithUTF8String:fromStr]];
if (linphone_chat_message_get_external_body_url(msg)) {
[chat setMessage:NSLocalizedString(@"Incoming file",nil)];
[chat setMessage:[NSString stringWithUTF8String:linphone_chat_message_get_external_body_url(msg)]];
} else {
[chat setMessage:[NSString stringWithUTF8String:linphone_chat_message_get_text(msg)]];
}
@ -443,17 +446,12 @@ static void linphone_iphone_registration_state(LinphoneCore *lc, LinphoneProxyCo
[chat create];
ms_free(fromStr);
NSString* ext_body_url=nil;
if (linphone_chat_message_get_external_body_url(msg)) {
ext_body_url=[NSString stringWithUTF8String:linphone_chat_message_get_external_body_url(msg)];
}
// Post event
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSValue valueWithPointer:room], @"room",
[NSValue valueWithPointer:linphone_chat_message_get_from(msg)], @"from",
chat.message, @"message",
chat, @"chat",
ext_body_url,@"external_body_url",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneTextReceived object:self userInfo:dict];
[chat release];

View file

@ -20,6 +20,8 @@
#import <UIKit/UIKit.h>
#import "ChatModel.h"
#import "ChatRoomTableViewController.h"
@interface UIChatRoomCell : UITableViewCell {
}
@ -33,10 +35,15 @@
@property (nonatomic, retain) IBOutlet UIButton *deleteButton;
@property (nonatomic, retain) IBOutlet UILabel *dateLabel;
@property (nonatomic, retain) IBOutlet UIImageView* statusImage;
@property (nonatomic, retain) IBOutlet UIButton* downloadButton;
- (id)initWithIdentifier:(NSString*)identifier;
+ (CGFloat)height:(ChatModel*)chat width:(int)width;
@property (nonatomic, retain) id<ChatRoomDelegate> chatRoomDelegate;
- (IBAction)onDeleteClick:(id)event;
- (IBAction)onDownloadClick:(id)event;
- (IBAction)onImageClick:(id)event;
@end

View file

@ -19,7 +19,11 @@
#import "UIChatRoomCell.h"
#import "Utils.h"
#import "LinphoneManager.h"
#import "PhoneMainView.h"
#import <AssetsLibrary/ALAsset.h>
#import <AssetsLibrary/ALAssetRepresentation.h>
#import <NinePatch.h>
#include "linphonecore.h"
@ -34,6 +38,8 @@
@synthesize dateLabel;
@synthesize chat;
@synthesize statusImage;
@synthesize downloadButton;
@synthesize chatRoomDelegate;
static const CGFloat CELL_MIN_HEIGHT = 40.0f;
static const CGFloat CELL_MIN_WIDTH = 150.0f;
@ -58,6 +64,7 @@ static UIFont *CELL_FONT = nil;
}
- (void)dealloc {
[chatRoomDelegate release];
[backgroundImage release];
[innerView release];
[bubbleView release];
@ -67,6 +74,7 @@ static UIFont *CELL_FONT = nil;
[dateLabel release];
[statusImage release];
[chat release];
[downloadButton release];
[super dealloc];
}
@ -92,15 +100,39 @@ static UIFont *CELL_FONT = nil;
[LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot update chat room cell: null chat"];
return;
}
if(true/*Change when image will be supported */) {
if([UIChatRoomCell isExternalImage:[chat message]]) {
[messageLabel setHidden:TRUE];
[messageImageView setImage:nil];
[messageImageView setHidden:TRUE];
[downloadButton setHidden:FALSE];
} else if([UIChatRoomCell isInternalImage:[chat message]]) {
[messageLabel setHidden:TRUE];
[[LinphoneManager instance].photoLibrary assetForURL:[NSURL URLWithString:[chat message]] resultBlock:^(ALAsset *asset) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) {
ALAssetRepresentation* representation = [asset defaultRepresentation];
UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage]];
dispatch_async(dispatch_get_main_queue(), ^{
[messageImageView setImage:image];
});
});
} failureBlock:^(NSError *error) {
[LinphoneLogger log:LinphoneLoggerError format:@"Can't read image"];
}];
[messageImageView setHidden:FALSE];
[downloadButton setHidden:TRUE];
} else {
[messageLabel setHidden:FALSE];
[messageLabel setText:[chat message]];
[messageImageView setImage:nil];
[messageImageView setHidden:TRUE];
} else {
[messageLabel setHidden:TRUE];
[messageImageView setHidden:FALSE];
[downloadButton setHidden:TRUE];
}
// Date
@ -112,16 +144,16 @@ static UIFont *CELL_FONT = nil;
[dateLabel setText:[dateFormatter stringFromDate:[chat time]]];
[dateFormatter release];
if ([chat.state intValue] == LinphoneChatMessageStateInProgress) {
[statusImage setImage:[UIImage imageNamed:@"chat_message_inprogress.png"] ];
statusImage.hidden=FALSE;
[statusImage setImage:[UIImage imageNamed:@"chat_message_inprogress.png"]];
statusImage.hidden = FALSE;
} else if ([chat.state intValue] == LinphoneChatMessageStateDelivered) {
[statusImage setImage:[UIImage imageNamed:@"chat_message_delivered.png"] ];
statusImage.hidden=FALSE;
[statusImage setImage:[UIImage imageNamed:@"chat_message_delivered.png"]];
statusImage.hidden = FALSE;
} else if ([chat.state intValue] == LinphoneChatMessageStateNotDelivered) {
[statusImage setImage:[UIImage imageNamed:@"chat_message_not_delivered.png"]];
statusImage.hidden=FALSE;
statusImage.hidden = FALSE;
} else {
statusImage.hidden=TRUE;
statusImage.hidden = TRUE;
}
}
@ -144,9 +176,17 @@ static UIFont *CELL_FONT = nil;
}
}
+ (BOOL)isExternalImage:(NSString *)message {
return [message hasPrefix:@"http:"] || [message hasPrefix:@"https:"];
}
+ (BOOL)isInternalImage:(NSString *)message {
return [message hasPrefix:@"assets-library:"];
}
+ (CGSize)viewSize:(ChatModel*)chat width:(int)width {
CGSize messageSize;
if(true/*Change when image will be supported */) {
if(!([UIChatRoomCell isExternalImage:[chat message]] || [UIChatRoomCell isInternalImage:[chat message]])) {
if(CELL_FONT == nil) {
CELL_FONT = [UIFont systemFontOfSize:CELL_FONT_SIZE];
}
@ -218,4 +258,15 @@ static UIFont *CELL_FONT = nil;
}
}
- (IBAction)onDownloadClick:(id)event {
[chatRoomDelegate chatRoomStartImageDownload:[NSURL URLWithString:chat.message] userInfo:chat];
}
- (IBAction)onImageClick:(id)event {
ImageViewController *controller = DYNAMIC_CAST([[PhoneMainView instance] changeCurrentView:[ImageViewController compositeViewDescription] push:TRUE], ImageViewController);
if(controller != nil) {
[controller setImage:messageImageView.image];
}
}
@end

View file

@ -15,6 +15,7 @@
<string>IBUIButton</string>
<string>IBUIImageView</string>
<string>IBUILabel</string>
<string>IBUITapGestureRecognizer</string>
<string>IBUIView</string>
</array>
<array key="IBDocument.PluginDependencies">
@ -69,7 +70,7 @@
<reference key="NSNextKeyView" ref="281972462"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<int key="IBUIContentMode">1</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<array key="IBUIGestureRecognizers" id="0"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUILabel" id="281972462">
@ -78,7 +79,7 @@
<string key="NSFrameSize">{294, 104}</string>
<reference key="NSSuperview" ref="773132586"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="859609488"/>
<reference key="NSNextKeyView" ref="872109847"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor" id="765717609">
<int key="NSColorSpace">3</int>
@ -109,6 +110,41 @@
</object>
<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
</object>
<object class="IBUIButton" id="872109847">
<reference key="NSNextResponder" ref="773132586"/>
<int key="NSvFlags">301</int>
<string key="NSFrame">{{81, 33}, {132, 37}}</string>
<reference key="NSSuperview" ref="773132586"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="859609488"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
<string key="IBUINormalTitle">Download image</string>
<object class="NSColor" key="IBUIHighlightedTitleColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
<object class="NSColor" key="IBUINormalTitleShadowColor" id="479423909">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
</object>
<object class="IBUIFontDescription" key="IBUIFontDescription" id="178165125">
<int key="type">2</int>
<double key="pointSize">15</double>
</object>
<object class="NSFont" key="IBUIFont" id="126548582">
<string key="NSName">Helvetica-Bold</string>
<double key="NSSize">15</double>
<int key="NSfFlags">16</int>
</object>
</object>
</array>
<string key="NSFrameSize">{294, 104}</string>
<reference key="NSSuperview" ref="456806949"/>
@ -117,7 +153,6 @@
<string key="NSReuseIdentifierKey">_NS:9</string>
<reference key="IBUIBackgroundColor" ref="765717609"/>
<bool key="IBUIClipsSubviews">YES</bool>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUILabel" id="504194589">
@ -135,10 +170,7 @@
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<string key="IBUIText">09/09/2009 at 09:09</string>
<object class="NSColor" key="IBUITextColor" id="479423909">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
</object>
<reference key="IBUITextColor" ref="479423909"/>
<nil key="IBUIHighlightedColor"/>
<int key="IBUIBaselineAdjustment">0</int>
<float key="IBUIMinimumFontSize">8</float>
@ -194,15 +226,8 @@
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">list_delete_default.png</string>
</object>
<object class="IBUIFontDescription" key="IBUIFontDescription">
<int key="type">2</int>
<double key="pointSize">15</double>
</object>
<object class="NSFont" key="IBUIFont">
<string key="NSName">Helvetica-Bold</string>
<double key="NSSize">15</double>
<int key="NSfFlags">16</int>
</object>
<reference key="IBUIFontDescription" ref="178165125"/>
<reference key="IBUIFont" ref="126548582"/>
</object>
</array>
<string key="NSFrame">{{13, 13}, {294, 114}}</string>
@ -245,6 +270,7 @@
<reference key="IBUIBackgroundColor" ref="765717609"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUITapGestureRecognizer" id="713762198"/>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
@ -328,6 +354,14 @@
</object>
<int key="connectionID">31</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">downloadButton</string>
<reference key="source" ref="841351856"/>
<reference key="destination" ref="872109847"/>
</object>
<int key="connectionID">34</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">onDeleteClick:</string>
@ -337,12 +371,39 @@
</object>
<int key="connectionID">32</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletCollectionConnection" key="connection">
<string key="label">gestureRecognizers</string>
<reference key="source" ref="546512518"/>
<reference key="destination" ref="713762198"/>
<string key="cachedDesigntimeCollectionClassName">NSArray</string>
<bool key="addsContentToExistingCollection">YES</bool>
</object>
<int key="connectionID">41</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">onDownloadClick:</string>
<reference key="source" ref="872109847"/>
<reference key="destination" ref="841351856"/>
<int key="IBEventType">7</int>
</object>
<int key="connectionID">39</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">onImageClick:</string>
<reference key="source" ref="713762198"/>
<reference key="destination" ref="841351856"/>
</object>
<int key="connectionID">42</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<array key="object" id="0"/>
<reference key="object" ref="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
@ -421,6 +482,7 @@
<array class="NSMutableArray" key="children">
<reference ref="281972462"/>
<reference ref="546512518"/>
<reference ref="872109847"/>
</array>
<reference key="parent" ref="456806949"/>
<string key="objectName">messageView</string>
@ -428,6 +490,7 @@
<object class="IBObjectRecord">
<int key="objectID">28</int>
<reference key="object" ref="546512518"/>
<array class="NSMutableArray" key="children"/>
<reference key="parent" ref="773132586"/>
<string key="objectName">messageImageView</string>
</object>
@ -437,6 +500,17 @@
<reference key="parent" ref="773132586"/>
<string key="objectName">messageLabel</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">33</int>
<reference key="object" ref="872109847"/>
<reference key="parent" ref="773132586"/>
<string key="objectName">downloadButton</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">40</int>
<reference key="object" ref="713762198"/>
<reference key="parent" ref="0"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@ -455,6 +529,8 @@
<string key="28.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="3.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="33.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="40.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</dictionary>
@ -462,29 +538,38 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">32</int>
<int key="maxID">42</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">UIChatRoomCell</string>
<string key="superclassName">UITableViewCell</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">onDeleteClick:</string>
<string key="NS.object.0">id</string>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<string key="NS.key.0">onDeleteClick:</string>
<object class="IBActionInfo" key="NS.object.0">
<dictionary class="NSMutableDictionary" key="actions">
<string key="onDeleteClick:">id</string>
<string key="onDownloadClick:">id</string>
<string key="onImageClick:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="onDeleteClick:">
<string key="name">onDeleteClick:</string>
<string key="candidateClassName">id</string>
</object>
</object>
<object class="IBActionInfo" key="onDownloadClick:">
<string key="name">onDownloadClick:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="onImageClick:">
<string key="name">onImageClick:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="backgroundImage">UIImageView</string>
<string key="bubbleView">UIView</string>
<string key="dateLabel">UILabel</string>
<string key="deleteButton">UIButton</string>
<string key="downloadButton">UIButton</string>
<string key="innerView">UIView</string>
<string key="messageImageView">UIImageView</string>
<string key="messageLabel">UILabel</string>
@ -507,6 +592,10 @@
<string key="name">deleteButton</string>
<string key="candidateClassName">UIButton</string>
</object>
<object class="IBToOneOutletInfo" key="downloadButton">
<string key="name">downloadButton</string>
<string key="candidateClassName">UIButton</string>
</object>
<object class="IBToOneOutletInfo" key="innerView">
<string key="name">innerView</string>
<string key="candidateClassName">UIView</string>

View file

@ -264,7 +264,7 @@
#pragma mark - ContactDetailsImagePickerDelegate Functions
- (void)imagePickerDelegateImage:(UIImage*)image {
- (void)imagePickerDelegateImage:(UIImage*)image info:(NSDictionary *)info{
NSError* error = NULL;
if(!ABPersonRemoveImageData(contact, (CFErrorRef*)error)) {
[LinphoneLogger log:LinphoneLoggerLog format:@"Can't add entry: %@", [error localizedDescription]];

View file

@ -156,7 +156,7 @@
</object>
<object class="IBUIView" id="229066993">
<reference key="NSNextResponder" ref="715329044"/>
<int key="NSvFlags">-2147483356</int>
<int key="NSvFlags">-2147483382</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="661332796">
<reference key="NSNextResponder" ref="229066993"/>
@ -166,10 +166,7 @@
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="164391443"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MSAwLjI4MzE1ODM3MjYgMC4wNTY3ODY4OTE2MQA</bytes>
</object>
<reference key="IBUIBackgroundColor" ref="460939904"/>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<object class="NSCustomResource" key="IBUIImage" id="172588711">
@ -179,7 +176,7 @@
</object>
<object class="IBUIButton" id="391057061">
<reference key="NSNextResponder" ref="229066993"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">297</int>
<string key="NSFrame">{{250, 0}, {70, 59}}</string>
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSWindow"/>
@ -214,7 +211,7 @@
</object>
<object class="IBUIProgressView" id="164391443">
<reference key="NSNextResponder" ref="229066993"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">298</int>
<string key="NSFrame">{{20, 25}, {213, 9}}</string>
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSWindow"/>
@ -274,6 +271,7 @@
<string key="NSFrame">{{250, 0}, {70, 59}}</string>
<reference key="NSSuperview" ref="833509359"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<object class="IBUIAccessibilityConfiguration" key="IBUIAccessibilityConfiguration">
@ -639,6 +637,14 @@
</object>
<int key="connectionID">86</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">transferBackgroundImage</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="661332796"/>
</object>
<int key="connectionID">88</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">dataSource</string>
@ -930,7 +936,7 @@
<int key="objectID">83</int>
<reference key="object" ref="661332796"/>
<reference key="parent" ref="229066993"/>
<string key="objectName">footerBackgroundImage</string>
<string key="objectName">transfertBackgroundImage</string>
</object>
</array>
</object>
@ -976,7 +982,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">87</int>
<int key="maxID">88</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -1047,6 +1053,7 @@
<string key="pictureButton">UIButton</string>
<string key="sendButton">UIButton</string>
<string key="tableController">ChatRoomTableViewController</string>
<string key="transferBackgroundImage">UIImageView</string>
<string key="transferView">UIView</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
@ -1114,6 +1121,10 @@
<string key="name">tableController</string>
<string key="candidateClassName">ChatRoomTableViewController</string>
</object>
<object class="IBToOneOutletInfo" key="transferBackgroundImage">
<string key="name">transferBackgroundImage</string>
<string key="candidateClassName">UIImageView</string>
</object>
<object class="IBToOneOutletInfo" key="transferView">
<string key="name">transferView</string>
<string key="candidateClassName">UIView</string>

View file

@ -42,7 +42,6 @@
<string key="NSFrame">{{0, 44}, {320, 416}}</string>
<reference key="NSSuperview" ref="191373211"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor" id="986758619">
<int key="NSColorSpace">3</int>
@ -58,7 +57,7 @@
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="714444944">
<reference key="NSNextResponder" ref="350805517"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">290</int>
<string key="NSFrameSize">{320, 44}</string>
<reference key="NSSuperview" ref="350805517"/>
<reference key="NSWindow"/>

View file

@ -151,7 +151,7 @@
</object>
<object class="IBUIView" id="229066993">
<reference key="NSNextResponder" ref="715329044"/>
<int key="NSvFlags">-2147483356</int>
<int key="NSvFlags">-2147483382</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="661332796">
<reference key="NSNextResponder" ref="229066993"/>
@ -160,10 +160,7 @@
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSNextKeyView" ref="164391443"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MSAwLjI4MzE1ODM3MjYgMC4wNTY3ODY4OTE2MQA</bytes>
</object>
<reference key="IBUIBackgroundColor" ref="460939904"/>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<object class="NSCustomResource" key="IBUIImage" id="172588711">
@ -173,7 +170,7 @@
</object>
<object class="IBUIButton" id="391057061">
<reference key="NSNextResponder" ref="229066993"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">297</int>
<string key="NSFrame">{{250, 0}, {70, 59}}</string>
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSNextKeyView" ref="833509359"/>
@ -207,7 +204,7 @@
</object>
<object class="IBUIProgressView" id="164391443">
<reference key="NSNextResponder" ref="229066993"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">298</int>
<string key="NSFrame">{{20, 25}, {213, 9}}</string>
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSNextKeyView" ref="391057061"/>
@ -615,6 +612,14 @@
</object>
<int key="connectionID">86</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">transferBackgroundImage</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="661332796"/>
</object>
<int key="connectionID">88</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">dataSource</string>
@ -906,7 +911,7 @@
<int key="objectID">83</int>
<reference key="object" ref="661332796"/>
<reference key="parent" ref="229066993"/>
<string key="objectName">footerBackgroundImage</string>
<string key="objectName">transfertBackgroundImage</string>
</object>
</array>
</object>
@ -952,7 +957,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">87</int>
<int key="maxID">88</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -1023,6 +1028,7 @@
<string key="pictureButton">UIButton</string>
<string key="sendButton">UIButton</string>
<string key="tableController">ChatRoomTableViewController</string>
<string key="transferBackgroundImage">UIImageView</string>
<string key="transferView">UIView</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
@ -1090,6 +1096,10 @@
<string key="name">tableController</string>
<string key="candidateClassName">ChatRoomTableViewController</string>
</object>
<object class="IBToOneOutletInfo" key="transferBackgroundImage">
<string key="name">transferBackgroundImage</string>
<string key="candidateClassName">UIImageView</string>
</object>
<object class="IBToOneOutletInfo" key="transferView">
<string key="name">transferView</string>
<string key="candidateClassName">UIView</string>

View file

@ -56,7 +56,7 @@
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="714444944">
<reference key="NSNextResponder" ref="350805517"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">290</int>
<string key="NSFrameSize">{320, 44}</string>
<reference key="NSSuperview" ref="350805517"/>
<reference key="NSNextKeyView" ref="771824371"/>

View file

@ -212,17 +212,17 @@
<dict>
<key>backup</key>
<dict>
<key>15</key>
<key>16</key>
<dict>
<key>class</key>
<string>BLWrapperHandle</string>
<key>name</key>
<string>Classes/ChatRoomViewController/15/ChatRoomViewController.xib</string>
<string>Classes/ChatRoomViewController/16/ChatRoomViewController.xib</string>
</dict>
</dict>
</dict>
<key>change date</key>
<date>2012-09-14T14:45:49Z</date>
<date>2012-09-18T13:03:28Z</date>
<key>changed values</key>
<array/>
<key>class</key>
@ -232,7 +232,7 @@
<key>flags</key>
<integer>0</integer>
<key>hash</key>
<string>1f8683826a86cb2ad7e55cc5c9dcafaf
<string>fb9acb898a88e8d219dfd663e9b8eb19
</string>
<key>name</key>
<string>ChatRoomViewController.xib</string>
@ -568,9 +568,9 @@
<key>versions</key>
<dict>
<key>en</key>
<string>15</string>
<string>16</string>
<key>fr</key>
<string>15</string>
<string>16</string>
</dict>
</dict>
<dict>
@ -4281,17 +4281,17 @@
<dict>
<key>backup</key>
<dict>
<key>3</key>
<key>4</key>
<dict>
<key>class</key>
<string>BLWrapperHandle</string>
<key>name</key>
<string>Classes/ImageViewController/3/ImageViewController.xib</string>
<string>Classes/ImageViewController/4/ImageViewController.xib</string>
</dict>
</dict>
</dict>
<key>change date</key>
<date>2012-09-14T13:00:17Z</date>
<date>2012-09-18T12:55:28Z</date>
<key>changed values</key>
<array/>
<key>class</key>
@ -4301,7 +4301,7 @@
<key>flags</key>
<integer>0</integer>
<key>hash</key>
<string>724a8c5069c0fbde9b1e56ef37a42cba
<string>cf8736251f03474edd9a8c46b942ae63
</string>
<key>name</key>
<string>ImageViewController.xib</string>
@ -4340,9 +4340,9 @@
<key>versions</key>
<dict>
<key>en</key>
<string>3</string>
<string>4</string>
<key>fr</key>
<string>3</string>
<string>4</string>
</dict>
</dict>
</array>
@ -7354,7 +7354,7 @@
</dict>
</dict>
<key>change date</key>
<date>2012-09-14T11:57:58Z</date>
<date>2012-09-18T14:20:34Z</date>
<key>changed values</key>
<array/>
<key>class</key>
@ -7364,7 +7364,7 @@
<key>flags</key>
<integer>0</integer>
<key>hash</key>
<string>dcecc0eedf9132813ef8a938d07d7917
<string>9801969515d6fafb3f05d8b036f9e80d
</string>
<key>name</key>
<string>Localizable.strings</string>
@ -7898,6 +7898,31 @@ La cause était: %2$@</string>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
<key>changed values</key>
<array/>
<key>class</key>
<string>BLStringKeyObject</string>
<key>comment</key>
<string>No comment provided by engineer.</string>
<key>errors</key>
<array/>
<key>flags</key>
<integer>0</integer>
<key>key</key>
<string>Cannot write image to photo library</string>
<key>localizations</key>
<dict>
<key>en</key>
<string>Cannot write image to photo library</string>
<key>fr</key>
<string>Impossible d'enregistrer l'image dans l'album photo</string>
</dict>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
@ -8373,31 +8398,6 @@ La cause était: %2$@</string>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
<key>changed values</key>
<array/>
<key>class</key>
<string>BLStringKeyObject</string>
<key>comment</key>
<string>No comment provided by engineer.</string>
<key>errors</key>
<array/>
<key>flags</key>
<integer>0</integer>
<key>key</key>
<string>Incoming file stored to your photo library</string>
<key>localizations</key>
<dict>
<key>en</key>
<string>Incoming file stored to your photo library</string>
<key>fr</key>
<string>Fichier entrant stocké</string>
</dict>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
@ -8721,31 +8721,6 @@ La cause était: %2$@</string>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
<key>changed values</key>
<array/>
<key>class</key>
<string>BLStringKeyObject</string>
<key>comment</key>
<string>No comment provided by engineer.</string>
<key>errors</key>
<array/>
<key>flags</key>
<integer>0</integer>
<key>key</key>
<string>Photo library</string>
<key>localizations</key>
<dict>
<key>en</key>
<string>Photo library</string>
<key>fr</key>
<string>Photos</string>
</dict>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
@ -9661,6 +9636,56 @@ Raison: %2$s</string>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
<key>changed values</key>
<array/>
<key>class</key>
<string>BLStringKeyObject</string>
<key>comment</key>
<string>No comment provided by engineer.</string>
<key>errors</key>
<array/>
<key>flags</key>
<integer>0</integer>
<key>key</key>
<string>Incoming file stored to your photo library</string>
<key>localizations</key>
<dict>
<key>en</key>
<string>Incoming file stored to your photo library</string>
<key>fr</key>
<string>Fichier entrant stocké</string>
</dict>
<key>snapshots</key>
<dict/>
</dict>
<dict>
<key>change date</key>
<date>2001-01-01T00:00:00Z</date>
<key>changed values</key>
<array/>
<key>class</key>
<string>BLStringKeyObject</string>
<key>comment</key>
<string>No comment provided by engineer.</string>
<key>errors</key>
<array/>
<key>flags</key>
<integer>0</integer>
<key>key</key>
<string>Photo library</string>
<key>localizations</key>
<dict>
<key>en</key>
<string>Photo library</string>
<key>fr</key>
<string>Photos</string>
</dict>
<key>snapshots</key>
<dict/>
</dict>
</array>
<key>plist file</key>
<false/>

View file

@ -156,7 +156,7 @@
</object>
<object class="IBUIView" id="229066993">
<reference key="NSNextResponder" ref="715329044"/>
<int key="NSvFlags">-2147483356</int>
<int key="NSvFlags">-2147483382</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="661332796">
<reference key="NSNextResponder" ref="229066993"/>
@ -166,10 +166,7 @@
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="164391443"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MSAwLjI4MzE1ODM3MjYgMC4wNTY3ODY4OTE2MQA</bytes>
</object>
<reference key="IBUIBackgroundColor" ref="460939904"/>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<object class="NSCustomResource" key="IBUIImage" id="172588711">
@ -179,7 +176,7 @@
</object>
<object class="IBUIButton" id="391057061">
<reference key="NSNextResponder" ref="229066993"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">297</int>
<string key="NSFrame">{{250, 0}, {70, 59}}</string>
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSWindow"/>
@ -214,7 +211,7 @@
</object>
<object class="IBUIProgressView" id="164391443">
<reference key="NSNextResponder" ref="229066993"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">298</int>
<string key="NSFrame">{{20, 25}, {213, 9}}</string>
<reference key="NSSuperview" ref="229066993"/>
<reference key="NSWindow"/>
@ -274,6 +271,7 @@
<string key="NSFrame">{{250, 0}, {70, 59}}</string>
<reference key="NSSuperview" ref="833509359"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<object class="IBUIAccessibilityConfiguration" key="IBUIAccessibilityConfiguration">
@ -639,6 +637,14 @@
</object>
<int key="connectionID">86</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">transferBackgroundImage</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="661332796"/>
</object>
<int key="connectionID">88</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">dataSource</string>
@ -930,7 +936,7 @@
<int key="objectID">83</int>
<reference key="object" ref="661332796"/>
<reference key="parent" ref="229066993"/>
<string key="objectName">footerBackgroundImage</string>
<string key="objectName">transfertBackgroundImage</string>
</object>
</array>
</object>
@ -976,7 +982,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">87</int>
<int key="maxID">88</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -1047,6 +1053,7 @@
<string key="pictureButton">UIButton</string>
<string key="sendButton">UIButton</string>
<string key="tableController">ChatRoomTableViewController</string>
<string key="transferBackgroundImage">UIImageView</string>
<string key="transferView">UIView</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
@ -1114,6 +1121,10 @@
<string key="name">tableController</string>
<string key="candidateClassName">ChatRoomTableViewController</string>
</object>
<object class="IBToOneOutletInfo" key="transferBackgroundImage">
<string key="name">transferBackgroundImage</string>
<string key="candidateClassName">UIImageView</string>
</object>
<object class="IBToOneOutletInfo" key="transferView">
<string key="name">transferView</string>
<string key="candidateClassName">UIView</string>

View file

@ -42,7 +42,6 @@
<string key="NSFrame">{{0, 44}, {320, 416}}</string>
<reference key="NSSuperview" ref="191373211"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor" id="986758619">
<int key="NSColorSpace">3</int>
@ -58,7 +57,7 @@
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="714444944">
<reference key="NSNextResponder" ref="350805517"/>
<int key="NSvFlags">292</int>
<int key="NSvFlags">290</int>
<string key="NSFrameSize">{320, 44}</string>
<reference key="NSSuperview" ref="350805517"/>
<reference key="NSWindow"/>