HomeModeUpdateViewController.m 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. //
  2. // HomeModeUpdateViewController.m
  3. //
  4. //
  5. // Created by Jason Lee on 10/30/15.
  6. //
  7. //
  8. #import "JDObject.h"
  9. #import "CustomButton.h"
  10. #import "CustomLabel.h"
  11. #import "CustomImageView.h"
  12. #import "RequestHandler.h"
  13. #import "JDJSONModel.h"
  14. #import "HomeModeUpdateViewController.h"
  15. #import "ModeModel.h"
  16. #import "DeviceSelectPopupView.h"
  17. #import "HomeModeSettingsViewController.h"
  18. @interface HomeModeUpdateViewController () {
  19. NSTimer *_modeChangePollingTimer;
  20. NSDate *_requestTime;
  21. }
  22. @end
  23. #pragma mark - Class Definition
  24. @implementation HomeModeUpdateViewController
  25. - (void)viewDidLoad {
  26. [super viewDidLoad];
  27. // Do any additional setup after loading the view.
  28. [self initUI];
  29. [self prepareViewDidLoad];
  30. }
  31. - (void)initUI {
  32. NSString *message = nil, *highlightMessage = nil;
  33. NSString *btnTitle = nil;
  34. if ([_mode.basicModeCode isEqualToString:HOME_MODE_HOME]) {
  35. btnTitle = @"귀가";
  36. highlightMessage = @"잘 돌아왔어요!";
  37. message = @"쾌적한 귀가모드를 \r실행할까요?";
  38. } else if ([_mode.basicModeCode isEqualToString:HOME_MODE_AWAY]) {
  39. btnTitle = @"외출";
  40. highlightMessage = @"안녕히 다녀오세요!";
  41. message = @"안전한 외출모드를 \r실행할까요?";
  42. } else if ([_mode.basicModeCode isEqualToString:HOME_MODE_MORNING]) {
  43. btnTitle = @"기상";
  44. highlightMessage = @"좋은 아침!";
  45. message = @"상쾌한 기상모드를\r실행할까요?";
  46. } else if ([_mode.basicModeCode isEqualToString:HOME_MODE_NIGHT]) {
  47. btnTitle = @"취침";
  48. highlightMessage = @"잘 자요!";
  49. message = @"편안한 취침모드를 \r실행할까요?";
  50. }
  51. [_btnExecute setTitle:btnTitle forState:UIControlStateNormal];
  52. _lblMessage.text = [NSString stringWithFormat:@"%@\n\n%@", highlightMessage, message];
  53. [_lblMessage setColor:kUITextColor02 text:highlightMessage];
  54. _btnSetting.hidden = [JDFacade facade].loginUser.level < 90;
  55. //TODO : set icon;
  56. }
  57. - (void)prepareViewDidLoad {
  58. }
  59. #pragma mark - Main Logic
  60. - (void)requestChangeHomeMode {
  61. NSString *modeTitle = [NSString stringWithFormat:@"%@ 모드", _mode.modeName];
  62. _lblMessage.text = [NSString stringWithFormat:@"%@\r\r실행 중입니다.", modeTitle];
  63. [_lblMessage setColor:kUITextColor02 text:modeTitle];
  64. NSString *path = [NSString stringWithFormat:API_POST_DASHBOARD_MODE_CHANGE, _mode.modeId];
  65. [[RequestHandler handler] sendAsyncPostRequestAPIPath:path parameters:nil modelClass:[JDJSONModel class] completion:^(id responseObject) {
  66. if ([[JDFacade facade].currentViewController isEqual:self]) {
  67. //check requet done,
  68. _requestTime = [NSDate systemDate];
  69. [self requestPollingHomeModeChanges];
  70. [self setContentsForComplete];
  71. }
  72. [[JDFacade facade] toast:[NSString stringWithFormat:@"%@ 상태가 되었습니다", _mode.modeName]];
  73. } failure:^(id errorObject) {
  74. JDErrorModel *error = (JDErrorModel *)errorObject;
  75. [[JDFacade facade] alert:error.errorMessage];
  76. }];
  77. }
  78. - (void)setContentsForComplete {
  79. NSString *highlightMessage = nil;
  80. highlightMessage = [NSString stringWithFormat:@"%@ 상태가 되었습니다.", _mode.modeName];
  81. //TODO : chagne button image
  82. }
  83. #pragma mark - UI Events
  84. - (IBAction)btnExecuteTouched:(id)sender {
  85. [self requestChangeHomeMode];
  86. }
  87. - (IBAction)btnSettingTouched:(id)sender {
  88. HomeModeSettingsViewController *vc = (HomeModeSettingsViewController *)[CommonUtil instantiateViewControllerWithIdentifier:@"HomeModeSettingsViewController" storyboardName:@"Main"];
  89. vc.mode = _mode;
  90. [self presentViewController:vc animated:YES completion:nil];
  91. }
  92. - (IBAction)btnCloseTouched:(id)sender {
  93. [self dismissViewControllerAnimated:YES completion:nil];
  94. }
  95. #pragma mark - MemoryWarning
  96. - (void)didReceiveMemoryWarning
  97. {
  98. [super didReceiveMemoryWarning];
  99. // Dispose of any resources that can be recreated.
  100. }
  101. - (NSInteger)elapsedSecondsFromNow {
  102. NSInteger seconds = 0;
  103. if (_requestTime) {
  104. NSTimeInterval elapsed = [[NSDate systemDate] timeIntervalSinceDate:_requestTime];
  105. seconds = elapsed;
  106. }
  107. return seconds;
  108. }
  109. - (void)requestPollingHomeModeChanges {
  110. //every 3sec?
  111. NSString *path = [NSString stringWithFormat:API_GET_MODE_STATUS, _mode.modeId];
  112. dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//RUN to background thread
  113. ModeModel *response = [[RequestHandler handler] sendSyncGetRequestAPIPath:path parameters:nil
  114. modelClass:[ModeModel class] showLoadingView:YES];
  115. if (response) {
  116. BOOL isRequestDone = [response.status boolValue];
  117. if (isRequestDone) {
  118. } else {
  119. //실행 여부 및 10초 경과 확인
  120. BOOL isOverTimeLimit = [self elapsedSecondsFromNow] > 10;
  121. }
  122. _mode.
  123. rdevice.isRequesting = [rdevice.contentValue isEqualToString:matchedDevice.contentValue] && !hasChangedStatus && !isOverTimeLimit;
  124. //TODO - home hub check
  125. // rdevice.requestTime = matchedDevice.requestTime;
  126. // rdevice.collectTime = matchedDevice.collectTime;
  127. rdevice.onlineState = matchedDevice.onlineState;
  128. if (!rdevice.isRequesting || !rdevice.isOnline || ![JDFacade facade].loginUser.isHomehubOnline) {//정상적으로 변경됨.
  129. rdevice.contentValue = matchedDevice.contentValue;
  130. [_commandArray removeObject:rdevice];
  131. isStatusChanged = YES;
  132. }
  133. #ifdef DEBUG_MODE
  134. NSLogInfo(@"==########== device command status = %@, elapsedTime = %zd ==########==", [JDFacade facade].loginUser.homehubOnlineState, elapsedTime);
  135. #endif
  136. }];
  137. }
  138. if (_commandArray.count) {//커맨드 실행 중인 디바이스가 있을 경우,
  139. //schedul timer.
  140. if (!_deviceCommandsBackgroundTimer) {
  141. _deviceCommandsBackgroundTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(requestPollingCommandStatusOfDeviceInBackground:) userInfo:nil repeats:YES];
  142. }
  143. } else {
  144. [_deviceCommandsBackgroundTimer invalidate];
  145. _deviceCommandsBackgroundTimer = nil;
  146. }
  147. //변화가 있을 경우, 컬렉션뷰를 리로드
  148. if (isStatusChanged) {
  149. [_collectionView reloadData];
  150. ThingsDetailViewController *vc = (ThingsDetailViewController *)[JDFacade facade].currentViewController;
  151. if (vc) {
  152. [vc.tableView reloadData];
  153. }
  154. }
  155. }
  156. @end