PageRenderTime 33ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/SPHChatBubble/SPHChatBubble/SPHViewController.m

https://gitlab.com/lisit1003/SPHChatBubble
Objective C | 800 lines | 585 code | 183 blank | 32 comment | 36 complexity | 90957b0f68d1fb6914a63941ff71f01a MD5 | raw file
  1. //
  2. // SPHViewController.m
  3. // SPHChatBubble
  4. //
  5. // Created by Siba Prasad Hota on 10/18/13.
  6. // Copyright (c) 2013 Wemakeappz. All rights reserved.
  7. //
  8. #import "SPHViewController.h"
  9. #import "SPHChatData.h"
  10. #import "SPHChatData.h"
  11. #import "SPHBubbleCell.h"
  12. #import "SPHBubbleCellImage.h"
  13. #import "SPHBubbleCellImageOther.h"
  14. #import "SPHBubbleCellOther.h"
  15. #import <QuartzCore/QuartzCore.h>
  16. #import "AsyncImageView.h"
  17. #import "MHFacebookImageViewer.h"
  18. #import "QBPopupMenu.h"
  19. #import <AssetsLibrary/AssetsLibrary.h>
  20. #import <MobileCoreServices/MobileCoreServices.h>
  21. #define messageWidth 260
  22. @interface SPHViewController ()
  23. @end
  24. @implementation SPHViewController
  25. @synthesize pullToRefreshManager = pullToRefreshManager_;
  26. @synthesize reloads = reloads_;
  27. @synthesize imgPicker;
  28. @synthesize Uploadedimage;
  29. - (void)viewDidLoad
  30. {
  31. [super viewDidLoad];
  32. sphBubbledata=[[NSMutableArray alloc]init];
  33. [self setUpTextFieldforIphone];
  34. [[NSNotificationCenter defaultCenter] addObserver:self
  35. selector:@selector(keyboardWillShow:)
  36. name:UIKeyboardWillShowNotification
  37. object:nil];
  38. [[NSNotificationCenter defaultCenter] addObserver:self
  39. selector:@selector(keyboardWillHide:)
  40. name:UIKeyboardWillHideNotification
  41. object:nil];
  42. pullToRefreshManager_ = [[MNMPullToRefreshManager alloc] initWithPullToRefreshViewHeight:60.0f
  43. tableView:self.sphChatTable
  44. withClient:self];
  45. [self setUpDummyMessages];
  46. // Do any additional setup after loading the view, typically from a nib.
  47. }
  48. -(void)setUpDummyMessages
  49. {
  50. NSDate *date = [NSDate date];
  51. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  52. [formatter setDateFormat:@"hh:mm a"];
  53. NSString *rowNumber=[NSString stringWithFormat:@"%d",sphBubbledata.count];
  54. [self adddBubbledata:@"textByme" mtext:@"Hi!!!!!!!" mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sending"];
  55. [self performSelector:@selector(messageSent:) withObject:rowNumber afterDelay:1.0];
  56. [self adddBubbledata:@"textbyother" mtext:@"Heloo!!!!!" mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sent"];
  57. rowNumber=[NSString stringWithFormat:@"%d",sphBubbledata.count];
  58. [self adddBubbledata:@"textByme" mtext:@"How are you doing today?" mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sending"];
  59. [self performSelector:@selector(messageSent:) withObject:rowNumber afterDelay:1.5];
  60. [self adddBubbledata:@"textbyother" mtext:@"I'm doing great! what abt you?" mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sent"];
  61. }
  62. #pragma mark MNMBottomPullToRefreshManagerClient
  63. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  64. {
  65. [pullToRefreshManager_ tableViewScrolled];
  66. }
  67. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
  68. {
  69. if (scrollView.contentOffset.y >=360.0f)
  70. {
  71. }
  72. else
  73. [pullToRefreshManager_ tableViewReleased];
  74. }
  75. - (void)pullToRefreshTriggered:(MNMPullToRefreshManager *)manager
  76. {
  77. reloads_++;
  78. [self performSelector:@selector(getEarlierMessages) withObject:nil afterDelay:0.0f];
  79. }
  80. -(void)getEarlierMessages
  81. {
  82. NSLog(@"get Earlir Messages And Appand to Array");
  83. [self performSelector:@selector(loadfinished) withObject:nil afterDelay:1];
  84. }
  85. -(void)loadfinished
  86. {
  87. [pullToRefreshManager_ tableViewReloadFinishedAnimated:YES];
  88. [self.sphChatTable reloadData];
  89. }
  90. - (void)didReceiveMemoryWarning
  91. {
  92. [super didReceiveMemoryWarning];
  93. // Dispose of any resources that can be recreated.
  94. }
  95. -(void)setUpTextFieldforIphone
  96. {
  97. containerView = [[UIView alloc] initWithFrame:CGRectMake(0,self.view.frame.size.height-40, 320, 40)];
  98. textView = [[HPGrowingTextView alloc] initWithFrame:CGRectMake(40, 3, 206, 40)];
  99. textView.contentInset = UIEdgeInsetsMake(0, 5, 0, 5);
  100. textView.minNumberOfLines = 1;
  101. textView.maxNumberOfLines = 6;
  102. textView.returnKeyType = UIReturnKeyDefault; //just as an example
  103. textView.font = [UIFont systemFontOfSize:15.0f];
  104. textView.delegate = self;
  105. textView.internalTextView.scrollIndicatorInsets = UIEdgeInsetsMake(5, 0, 5, 0);
  106. textView.backgroundColor = [UIColor whiteColor];
  107. // textView.text = @"test\n\ntest";
  108. // textView.animateHeightChange = NO; //turns off animation
  109. [self.view addSubview:containerView];
  110. UIImage *rawEntryBackground = [UIImage imageNamed:@"MessageEntryInputField.png"];
  111. UIImage *entryBackground = [rawEntryBackground stretchableImageWithLeftCapWidth:13 topCapHeight:22];
  112. UIImageView *entryImageView = [[UIImageView alloc] initWithImage:entryBackground];
  113. entryImageView.frame = CGRectMake(40, 0,210, 40);
  114. entryImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
  115. UIImage *rawBackground = [UIImage imageNamed:@"MessageEntryBackground.png"];
  116. UIImage *background = [rawBackground stretchableImageWithLeftCapWidth:13 topCapHeight:22];
  117. UIImageView *imageView = [[UIImageView alloc] initWithImage:background];
  118. imageView.frame = CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height);
  119. imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
  120. textView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  121. // view hierachy
  122. [containerView addSubview:imageView];
  123. [containerView addSubview:textView];
  124. [containerView addSubview:entryImageView];
  125. UIImage *sendBtnBackground = [[UIImage imageNamed:@"MessageEntrySendButton.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
  126. UIImage *camBtnBackground = [[UIImage imageNamed:@"cam.png"] stretchableImageWithLeftCapWidth:0 topCapHeight:0];
  127. UIImage *selectedSendBtnBackground = [[UIImage imageNamed:@"MessageEntrySendButton.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
  128. UIButton *doneBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  129. doneBtn.frame = CGRectMake(containerView.frame.size.width - 69, 8, 63, 27);
  130. doneBtn.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin;
  131. [doneBtn setTitle:@"send" forState:UIControlStateNormal];
  132. [doneBtn setTitleShadowColor:[UIColor colorWithWhite:0 alpha:0.4] forState:UIControlStateNormal];
  133. doneBtn.titleLabel.shadowOffset = CGSizeMake (0.0, -1.0);
  134. doneBtn.titleLabel.font = [UIFont boldSystemFontOfSize:18.0f];
  135. [doneBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  136. [doneBtn addTarget:self action:@selector(resignTextView) forControlEvents:UIControlEventTouchUpInside];
  137. [doneBtn setBackgroundImage:sendBtnBackground forState:UIControlStateNormal];
  138. [doneBtn setBackgroundImage:selectedSendBtnBackground forState:UIControlStateSelected];
  139. [containerView addSubview:doneBtn];
  140. UIButton *doneBtn2 = [UIButton buttonWithType:UIButtonTypeCustom];
  141. doneBtn2.frame = CGRectMake(containerView.frame.origin.x+1,2, 35,40);
  142. doneBtn2.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin;
  143. [doneBtn2 setTitle:@"" forState:UIControlStateNormal];
  144. [doneBtn2 setTitleShadowColor:[UIColor colorWithWhite:0 alpha:0.4] forState:UIControlStateNormal];
  145. doneBtn2.titleLabel.shadowOffset = CGSizeMake (0.0, -1.0);
  146. doneBtn2.titleLabel.font = [UIFont boldSystemFontOfSize:18.0f];
  147. [doneBtn2 setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  148. [doneBtn2 addTarget:self action:@selector(uploadImage:) forControlEvents:UIControlEventTouchUpInside];
  149. [doneBtn2 setBackgroundImage:camBtnBackground forState:UIControlStateNormal];
  150. //[doneBtn2 setBackgroundImage:selectedSendBtnBackground forState:UIControlStateSelected];
  151. [containerView addSubview:doneBtn2];
  152. containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
  153. }
  154. -(void)resignTextView{
  155. if ([textView.text length]<1) {
  156. }
  157. else
  158. {
  159. NSString *chat_Message=textView.text;
  160. textView.text=@"";
  161. NSDate *date = [NSDate date];
  162. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  163. [formatter setDateFormat:@"hh:mm a"];
  164. NSString *rowNumber=[NSString stringWithFormat:@"%d",sphBubbledata.count];
  165. if (sphBubbledata.count%2==0) {
  166. [self adddBubbledata:@"textByme" mtext:chat_Message mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sending"];
  167. }else{
  168. [self adddBubbledata:@"textbyother" mtext:chat_Message mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sending"];
  169. }
  170. [self performSelector:@selector(messageSent:) withObject:rowNumber afterDelay:2.0];
  171. }
  172. }
  173. -(IBAction)messageSent:(id)sender
  174. {
  175. NSLog(@"row= %@", sender);
  176. SPHChatData *feed_data=[[SPHChatData alloc]init];
  177. feed_data=[sphBubbledata objectAtIndex:[sender intValue]];
  178. feed_data.messagestatus=@"Sent";
  179. [sphBubbledata removeObjectAtIndex:[sender intValue]];
  180. [sphBubbledata insertObject:feed_data atIndex:[sender intValue]];
  181. [self.sphChatTable reloadData];
  182. }
  183. -(IBAction)uploadImage:(id)sender
  184. {
  185. if ([UIImagePickerController isSourceTypeAvailable:
  186. UIImagePickerControllerSourceTypeSavedPhotosAlbum])
  187. {
  188. UIImagePickerController *imagePicker =
  189. [[UIImagePickerController alloc] init];
  190. imagePicker.delegate = self;
  191. imagePicker.sourceType =
  192. UIImagePickerControllerSourceTypePhotoLibrary;
  193. imgPicker.mediaTypes = [NSArray arrayWithObjects:
  194. (NSString *) kUTTypeImage,
  195. nil];
  196. imagePicker.allowsEditing = NO;
  197. [self presentViewController:imagePicker animated:YES completion:nil];
  198. newMedia = NO;
  199. }
  200. }
  201. //http://www.binarytribune.com/wp-content/uploads/2013/06/india_binary_options-274x300.png
  202. -(void)imagePickerControllerDidCancel:
  203. (UIImagePickerController *)picker
  204. {
  205. [self dismissViewControllerAnimated:YES completion:nil];
  206. }
  207. -(void)imagePickerController:(UIImagePickerController *)picker
  208. didFinishPickingMediaWithInfo:(NSDictionary *)info
  209. {
  210. NSString *mediaType = [info
  211. objectForKey:UIImagePickerControllerMediaType];
  212. [self dismissViewControllerAnimated:YES completion:nil];
  213. if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
  214. UIImage *image = [info
  215. objectForKey:UIImagePickerControllerOriginalImage];
  216. Uploadedimage.image=image;
  217. if (newMedia)
  218. UIImageWriteToSavedPhotosAlbum(image,
  219. self,
  220. @selector(image:finishedSavingWithError:contextInfo:),
  221. nil);
  222. }
  223. else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
  224. {
  225. // Code here to support video if enabled
  226. }
  227. [self performSelector:@selector(uploadToServer) withObject:nil afterDelay:0.0];
  228. }
  229. -(void)uploadToServer
  230. {
  231. NSString *chat_Message=textView.text;
  232. textView.text=@"";
  233. NSDate *date = [NSDate date];
  234. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  235. [formatter setDateFormat:@"hh:mm a"];
  236. NSString *rowNumber=[NSString stringWithFormat:@"%d",sphBubbledata.count];
  237. if (sphBubbledata.count%2==0) {
  238. [self adddBubbledata:@"ImageByme" mtext:chat_Message mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sending"];
  239. }else{
  240. [self adddBubbledata:@"ImageByother" mtext:chat_Message mtime:[formatter stringFromDate:date] mimage:Uploadedimage.image msgstatus:@"Sending"];
  241. }
  242. [self performSelector:@selector(messageSent:) withObject:rowNumber afterDelay:1.0];
  243. }
  244. -(void)image:(UIImage *)image
  245. finishedSavingWithError:(NSError *)error
  246. contextInfo:(void *)contextInfo
  247. {
  248. if (error) {
  249. UIAlertView *alert = [[UIAlertView alloc]
  250. initWithTitle: @"Save failed"
  251. message: @"Failed to save image"\
  252. delegate: nil
  253. cancelButtonTitle:@"OK"
  254. otherButtonTitles:nil];
  255. [alert show];
  256. }
  257. }
  258. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
  259. return sphBubbledata.count;
  260. }
  261. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  262. {
  263. SPHChatData *feed_data=[[SPHChatData alloc]init];
  264. feed_data=[sphBubbledata objectAtIndex:indexPath.row];
  265. if ([feed_data.messageType isEqualToString:@"textByme"]||[feed_data.messageType isEqualToString:@"textbyother"])
  266. {
  267. float cellHeight;
  268. // text
  269. NSString *messageText = feed_data.messageText;
  270. //
  271. CGSize boundingSize = CGSizeMake(messageWidth-20, 10000000);
  272. CGSize itemTextSize = [messageText sizeWithFont:[UIFont systemFontOfSize:14]
  273. constrainedToSize:boundingSize
  274. lineBreakMode:NSLineBreakByWordWrapping];
  275. // plain text
  276. cellHeight = itemTextSize.height;
  277. if (cellHeight<25) {
  278. cellHeight=25;
  279. }
  280. return cellHeight+30;
  281. }
  282. else{
  283. return 140;
  284. }
  285. }
  286. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  287. {
  288. [self.sphChatTable deselectRowAtIndexPath:indexPath animated:YES];
  289. }
  290. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  291. {
  292. SPHChatData *feed_data=[[SPHChatData alloc]init];
  293. feed_data=[sphBubbledata objectAtIndex:indexPath.row];
  294. NSString *messageText = feed_data.messageText;
  295. static NSString *CellIdentifier1 = @"Cell1";
  296. static NSString *CellIdentifier2 = @"Cell2";
  297. static NSString *CellIdentifier3 = @"Cell3";
  298. static NSString *CellIdentifier4 = @"Cell4";
  299. CGSize boundingSize = CGSizeMake(messageWidth-20, 10000000);
  300. CGSize itemTextSize = [messageText sizeWithFont:[UIFont systemFontOfSize:14]
  301. constrainedToSize:boundingSize
  302. lineBreakMode:NSLineBreakByWordWrapping];
  303. float textHeight = itemTextSize.height+7;
  304. int x=0;
  305. if (textHeight>200)
  306. {
  307. x=65;
  308. }else
  309. if (textHeight>150)
  310. {
  311. x=50;
  312. }
  313. else if (textHeight>80)
  314. {
  315. x=30;
  316. }else
  317. if (textHeight>50)
  318. {
  319. x=20;
  320. }else
  321. if (textHeight>30) {
  322. x=8;
  323. }
  324. // Types= ImageByme , imageByOther textByme ,textbyother
  325. if ([feed_data.messageType isEqualToString:@"textByme"]) {
  326. SPHBubbleCellOther *cell = (SPHBubbleCellOther *)[self.sphChatTable dequeueReusableCellWithIdentifier:CellIdentifier1];
  327. if (cell == nil) {
  328. NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SPHBubbleCellOther" owner:self options:nil];
  329. cell = [topLevelObjects objectAtIndex:0];
  330. }
  331. else{
  332. }
  333. UIImageView *bubbleImage=[[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"Bubbletyperight"] stretchableImageWithLeftCapWidth:21 topCapHeight:14]];
  334. bubbleImage.tag=55;
  335. [cell.contentView addSubview:bubbleImage];
  336. [bubbleImage setFrame:CGRectMake(265-itemTextSize.width,5,itemTextSize.width+14,textHeight+4)];
  337. UITextView *messageTextview=[[UITextView alloc]initWithFrame:CGRectMake(260 - itemTextSize.width+5,2,itemTextSize.width+10, textHeight-2)];
  338. [cell.contentView addSubview:messageTextview];
  339. messageTextview.editable=NO;
  340. messageTextview.text = messageText;
  341. messageTextview.dataDetectorTypes=UIDataDetectorTypeAll;
  342. messageTextview.textAlignment=NSTextAlignmentJustified;
  343. messageTextview.font=[UIFont fontWithName:@"Helvetica Neue" size:12.0];
  344. messageTextview.backgroundColor=[UIColor clearColor];
  345. messageTextview.tag=indexPath.row;
  346. cell.Avatar_Image.image=[UIImage imageNamed:@"Customer_icon"];
  347. cell.time_Label.text=feed_data.messageTime;
  348. cell.selectionStyle=UITableViewCellSelectionStyleNone;
  349. messageTextview.scrollEnabled=NO;
  350. [cell.Avatar_Image setupImageViewer];
  351. if ([feed_data.messagestatus isEqualToString:@"Sent"]) {
  352. cell.statusindicator.alpha=0.0;
  353. [cell.statusindicator stopAnimating];
  354. cell.statusImage.alpha=1.0;
  355. [cell.statusImage setImage:[UIImage imageNamed:@"success"]];
  356. }else if ([feed_data.messagestatus isEqualToString:@"Sending"])
  357. {
  358. cell.statusImage.alpha=0.0;
  359. cell.statusindicator.alpha=1.0;
  360. [cell.statusindicator startAnimating];
  361. }
  362. else
  363. {
  364. cell.statusindicator.alpha=0.0;
  365. [cell.statusindicator stopAnimating];
  366. cell.statusImage.alpha=1.0;
  367. [cell.statusImage setImage:[UIImage imageNamed:@"failed"]];
  368. }
  369. cell.Avatar_Image.layer.cornerRadius = 20.0;
  370. cell.Avatar_Image.layer.masksToBounds = YES;
  371. cell.Avatar_Image.layer.borderColor = [UIColor whiteColor].CGColor;
  372. cell.Avatar_Image.layer.borderWidth = 2.0;
  373. UITapGestureRecognizer *singleFingerTap =
  374. [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
  375. [messageTextview addGestureRecognizer:singleFingerTap];
  376. singleFingerTap.delegate = self;
  377. return cell;
  378. }
  379. else
  380. if ([feed_data.messageType isEqualToString:@"textbyother"]) {
  381. SPHBubbleCell *cell = (SPHBubbleCell *)[self.sphChatTable dequeueReusableCellWithIdentifier:CellIdentifier2];
  382. if (cell == nil) {
  383. NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SPHBubbleCell" owner:self options:nil];
  384. cell = [topLevelObjects objectAtIndex:0];
  385. }
  386. else{
  387. }
  388. //[bubbleImage setFrame:CGRectMake(265-itemTextSize.width,5,itemTextSize.width+14,textHeight+4)];
  389. UIImageView *bubbleImage=[[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"Bubbletypeleft"] stretchableImageWithLeftCapWidth:21 topCapHeight:14]];
  390. [cell.contentView addSubview:bubbleImage];
  391. [bubbleImage setFrame:CGRectMake(50,5, itemTextSize.width+18, textHeight+4)];
  392. bubbleImage.tag=56;
  393. //CGRectMake(260 - itemTextSize.width+5,2,itemTextSize.width+10, textHeight-2)];
  394. UITextView *messageTextview=[[UITextView alloc]initWithFrame:CGRectMake(60,2,itemTextSize.width+10, textHeight-2)];
  395. [cell.contentView addSubview:messageTextview];
  396. messageTextview.editable=NO;
  397. messageTextview.text = messageText;
  398. messageTextview.dataDetectorTypes=UIDataDetectorTypeAll;
  399. messageTextview.textAlignment=NSTextAlignmentJustified;
  400. messageTextview.backgroundColor=[UIColor clearColor];
  401. messageTextview.font=[UIFont fontWithName:@"Helvetica Neue" size:12.0];
  402. messageTextview.scrollEnabled=NO;
  403. messageTextview.tag=indexPath.row;
  404. messageTextview.textColor=[UIColor whiteColor];
  405. cell.Avatar_Image.layer.cornerRadius = 20.0;
  406. cell.Avatar_Image.layer.masksToBounds = YES;
  407. cell.Avatar_Image.layer.borderColor = [UIColor whiteColor].CGColor;
  408. cell.Avatar_Image.layer.borderWidth = 2.0;
  409. [cell.Avatar_Image setupImageViewer];
  410. cell.Avatar_Image.image=[UIImage imageNamed:@"my_icon"];
  411. cell.time_Label.text=feed_data.messageTime;
  412. cell.selectionStyle=UITableViewCellSelectionStyleNone;
  413. UITapGestureRecognizer *singleFingerTap =
  414. [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
  415. [messageTextview addGestureRecognizer:singleFingerTap];
  416. singleFingerTap.delegate = self;
  417. return cell;
  418. }
  419. else
  420. if ([feed_data.messageType isEqualToString:@"ImageByme"])
  421. {
  422. SPHBubbleCellImage *cell = (SPHBubbleCellImage *)[self.sphChatTable dequeueReusableCellWithIdentifier:CellIdentifier3];
  423. if (cell == nil)
  424. {
  425. NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SPHBubbleCellImage" owner:self options:nil];
  426. cell = [topLevelObjects objectAtIndex:0];
  427. }
  428. else
  429. {
  430. }
  431. if ([feed_data.messagestatus isEqualToString:@"Sent"])
  432. {
  433. cell.statusindicator.alpha=0.0;
  434. [cell.statusindicator stopAnimating];
  435. cell.statusImage.alpha=1.0;
  436. [cell.statusImage setImage:[UIImage imageNamed:@"success"]];
  437. // cell.message_Image.imageURL=[NSURL URLWithString:feed_data.messageImageURL];
  438. }
  439. else
  440. if ([feed_data.messagestatus isEqualToString:@"Sending"])
  441. {
  442. cell.message_Image.image=[UIImage imageNamed:@""];
  443. //cell.message_Image.imageURL=[NSURL URLWithString:feed_data.messageImageURL];
  444. cell.statusImage.alpha=0.0;
  445. cell.statusindicator.alpha=1.0;
  446. [cell.statusindicator startAnimating];
  447. }
  448. else
  449. {
  450. cell.statusindicator.alpha=0.0;
  451. [cell.statusindicator stopAnimating];
  452. cell.statusImage.alpha=1.0;
  453. [cell.statusImage setImage:[UIImage imageNamed:@"failed"]];
  454. }
  455. cell.message_Image.image=Uploadedimage.image;
  456. cell.Avatar_Image.layer.cornerRadius = 20.0;
  457. cell.Avatar_Image.layer.masksToBounds = YES;
  458. cell.Avatar_Image.layer.borderColor = [UIColor whiteColor].CGColor;
  459. cell.Avatar_Image.layer.borderWidth = 2.0;
  460. [cell.Avatar_Image setupImageViewer];
  461. // cell.Buble_image.image= [[UIImage imageNamed:@"Bubbletyperight"] stretchableImageWithLeftCapWidth:21 topCapHeight:14];
  462. [cell.message_Image setupImageViewer];
  463. cell.Avatar_Image.image=[UIImage imageNamed:@"Customer_icon"];
  464. cell.time_Label.text=feed_data.messageTime;
  465. cell.selectionStyle=UITableViewCellSelectionStyleNone;
  466. return cell;
  467. }else{
  468. SPHBubbleCellImageOther *cell = (SPHBubbleCellImageOther *)[self.sphChatTable dequeueReusableCellWithIdentifier:CellIdentifier4];
  469. if (cell == nil)
  470. {
  471. NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SPHBubbleCellImageOther" owner:self options:nil];
  472. cell = [topLevelObjects objectAtIndex:0];
  473. }
  474. else{
  475. }
  476. [cell.message_Image setupImageViewer];
  477. // cell.Buble_image.image= [[UIImage imageNamed:@"Bubbletypeleft"] stretchableImageWithLeftCapWidth:15 topCapHeight:14];
  478. cell.message_Image.imageURL=[NSURL URLWithString:@"http://www.binarytribune.com/wp-content/uploads/2013/06/india_binary_options-274x300.png"];
  479. cell.Avatar_Image.layer.cornerRadius = 20.0;
  480. cell.Avatar_Image.layer.masksToBounds = YES;
  481. cell.Avatar_Image.layer.borderColor = [UIColor whiteColor].CGColor;
  482. cell.Avatar_Image.layer.borderWidth = 2.0;
  483. [cell.Avatar_Image setupImageViewer];
  484. cell.Avatar_Image.image=[UIImage imageNamed:@"my_icon"];
  485. cell.time_Label.text=feed_data.messageTime;
  486. cell.selectionStyle=UITableViewCellSelectionStyleNone;
  487. return cell;
  488. }
  489. }
  490. -(void)adddBubbledata:(NSString*)messageType mtext:(NSString*)messagetext mtime:(NSString*)messageTime mimage:(UIImage*)messageImage msgstatus:(NSString*)status;
  491. {
  492. SPHChatData *feed_data=[[SPHChatData alloc]init];
  493. feed_data.messageText=messagetext;
  494. feed_data.messageImageURL=messagetext;
  495. feed_data.messageImage=messageImage;
  496. feed_data.messageTime=messageTime;
  497. feed_data.messageType=messageType;
  498. feed_data.messagestatus=status;
  499. [sphBubbledata addObject:feed_data];
  500. [self.sphChatTable reloadData];
  501. [self performSelector:@selector(scrollTableview) withObject:nil afterDelay:0.0];
  502. }
  503. -(void)adddBubbledataatIndex:(NSInteger)rownum messagetype:(NSString*)messageType mtext:(NSString*)messagetext mtime:(NSString*)messageTime mimage:(UIImage*)messageImage msgstatus:(NSString*)status;
  504. {
  505. SPHChatData *feed_data=[[SPHChatData alloc]init];
  506. feed_data.messageText=messagetext;
  507. feed_data.messageImageURL=messagetext;
  508. feed_data.messageImage=messageImage;
  509. feed_data.messageTime=messageTime;
  510. feed_data.messageType=messageType;
  511. feed_data.messagestatus=status;
  512. [sphBubbledata removeObjectAtIndex:rownum];
  513. [sphBubbledata insertObject:feed_data atIndex:rownum];
  514. [self.sphChatTable reloadData];
  515. [self performSelector:@selector(scrollTableview) withObject:nil afterDelay:0.0];
  516. }
  517. -(void)tapRecognized:(UITapGestureRecognizer *)tapGR
  518. {
  519. UITextView *theTextView = (UITextView *)tapGR.view;
  520. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:theTextView.tag inSection:0];
  521. SPHChatData *feed_data=[[SPHChatData alloc]init];
  522. feed_data=[sphBubbledata objectAtIndex:indexPath.row];
  523. selectedRow=indexPath.row;
  524. [self.sphChatTable reloadData];
  525. if ([feed_data.messageType isEqualToString:@"textByme"])
  526. {
  527. SPHBubbleCellOther *mycell=(SPHBubbleCellOther*)[self.sphChatTable cellForRowAtIndexPath:indexPath];
  528. UIImageView *bubbleImage=(UIImageView *)[mycell viewWithTag:55];
  529. bubbleImage.image=[[UIImage imageNamed:@"Bubbletyperight_highlight"] stretchableImageWithLeftCapWidth:21 topCapHeight:14];
  530. }else
  531. if ([feed_data.messageType isEqualToString:@"textbyother"])
  532. {
  533. SPHBubbleCell *mycell=(SPHBubbleCell*)[self.sphChatTable cellForRowAtIndexPath:indexPath];
  534. UIImageView *bubbleImage=(UIImageView *)[mycell viewWithTag:56];
  535. bubbleImage.image=[[UIImage imageNamed:@"Bubbletypeleft_highlight"] stretchableImageWithLeftCapWidth:21 topCapHeight:14];
  536. }
  537. CGPoint touchPoint = [tapGR locationInView:self.view];
  538. [self.popupMenu showInView:self.view atPoint:touchPoint];
  539. [self.sphChatTable selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
  540. [self.sphChatTable.delegate tableView:self.sphChatTable didSelectRowAtIndexPath:indexPath];
  541. }
  542. -(IBAction)bookmarkClicked:(id)sender
  543. {
  544. NSLog( @"Book mark clicked at row : %d",selectedRow);
  545. }
  546. -(void)dismissKeyboard
  547. {
  548. [self.view endEditing:YES];
  549. }
  550. -(void)scrollTableview
  551. {
  552. [self.sphChatTable reloadData];
  553. int lastSection=[self.sphChatTable numberOfSections]-1;
  554. int lastRowNumber = [self.sphChatTable numberOfRowsInSection:lastSection]-1;
  555. NSIndexPath* ip = [NSIndexPath indexPathForRow:lastRowNumber inSection:lastSection];
  556. [self.sphChatTable scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:YES];
  557. }
  558. -(void) keyboardWillShow:(NSNotification *)note
  559. {
  560. if (sphBubbledata.count>2) {
  561. [self performSelector:@selector(scrollTableview) withObject:nil afterDelay:0.0];
  562. }
  563. // get keyboard size and loctaion
  564. CGRect keyboardBounds;
  565. [[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];
  566. NSNumber *duration = [note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
  567. NSNumber *curve = [note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];
  568. // Need to translate the bounds to account for rotation.
  569. keyboardBounds = [self.view convertRect:keyboardBounds toView:nil];
  570. // get a rect for the textView frame
  571. CGRect containerFrame = containerView.frame;
  572. containerFrame.origin.y = self.view.bounds.size.height - (keyboardBounds.size.height + containerFrame.size.height);
  573. CGRect tableviewframe=self.sphChatTable.frame;
  574. tableviewframe.size.height-=160;
  575. [UIView beginAnimations:nil context:NULL];
  576. [UIView setAnimationBeginsFromCurrentState:YES];
  577. [UIView setAnimationDuration:[duration doubleValue]];
  578. [UIView setAnimationCurve:[curve intValue]];
  579. containerView.frame = containerFrame;
  580. self.sphChatTable.frame=tableviewframe;
  581. [UIView commitAnimations];
  582. }
  583. -(void) keyboardWillHide:(NSNotification *)note
  584. {
  585. NSNumber *duration = [note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
  586. NSNumber *curve = [note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];
  587. CGRect keyboardBounds;
  588. [[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];
  589. keyboardBounds = [self.view convertRect:keyboardBounds toView:nil];
  590. // get a rect for the textView frame
  591. CGRect containerFrame = containerView.frame;
  592. containerFrame.origin.y = self.view.bounds.size.height - containerFrame.size.height;
  593. CGRect tableviewframe=self.sphChatTable.frame;
  594. tableviewframe.size.height+=160;
  595. // animations settings
  596. [UIView beginAnimations:nil context:NULL];
  597. [UIView setAnimationBeginsFromCurrentState:YES];
  598. [UIView setAnimationDuration:[duration doubleValue]];
  599. [UIView setAnimationCurve:[curve intValue]];
  600. // set views with new info
  601. self.sphChatTable.frame=tableviewframe;
  602. containerView.frame = containerFrame;
  603. // commit animations
  604. [UIView commitAnimations];
  605. }
  606. - (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height
  607. {
  608. float diff = (growingTextView.frame.size.height - height);
  609. CGRect r = containerView.frame;
  610. r.size.height -= diff;
  611. r.origin.y += diff;
  612. containerView.frame = r;
  613. }
  614. - (IBAction)endViewedit:(id)sender {
  615. [self.view endEditing:YES];
  616. }
  617. @end