DeviceActivity.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package kr.co.icontrols.iotplatform;
  2. import androidx.annotation.NonNull;
  3. import androidx.annotation.Nullable;
  4. import androidx.appcompat.app.AppCompatActivity;
  5. import android.app.Activity;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.os.Parcelable;
  11. import android.view.View;
  12. import android.widget.AdapterView;
  13. import android.widget.ListView;
  14. import android.widget.TextView;
  15. import org.json.JSONArray;
  16. import org.json.JSONException;
  17. import org.json.JSONObject;
  18. import java.io.IOException;
  19. import java.util.ArrayList;
  20. import kr.co.icontrols.iotplatform.DataClass.DeviceInfo;
  21. import kr.co.icontrols.iotplatform.DataClass.UserInfo;
  22. import kr.co.icontrols.iotplatform.Database.DBUtil;
  23. import kr.co.icontrols.iotplatform.Mqtt.MqttController;
  24. import kr.co.icontrols.iotplatform.adapter.DeviceListAdapter;
  25. import kr.co.icontrols.iotplatform.utils.GetSessionCallback;
  26. import kr.co.icontrols.iotplatform.utils.HttpApi;
  27. import okhttp3.Call;
  28. import okhttp3.Callback;
  29. import okhttp3.Response;
  30. import static kr.co.icontrols.iotplatform.Database.DatabaseHelper.TABLE_DEVICE_RANK;
  31. import static kr.co.icontrols.iotplatform.PopupActivity.POPUP_BUNDLE;
  32. import static kr.co.icontrols.iotplatform.PopupActivity.POPUP_IMG_INDEX;
  33. import static kr.co.icontrols.iotplatform.utils.CommonUtils.DismissConnectDialog;
  34. import static kr.co.icontrols.iotplatform.utils.CommonUtils.ErrorLogOutput;
  35. import static kr.co.icontrols.iotplatform.utils.CommonUtils.ForceDismissConnectDialog;
  36. import static kr.co.icontrols.iotplatform.utils.CommonUtils.WarnLogOutput;
  37. import static kr.co.icontrols.iotplatform.utils.CommonUtils.cancelToExit;
  38. import static kr.co.icontrols.iotplatform.utils.CommonUtils.displayProgress;
  39. import static kr.co.icontrols.iotplatform.utils.CommonUtils.getCognitoSession;
  40. import static kr.co.icontrols.iotplatform.utils.CommonUtils.isExpiredSession;
  41. import static kr.co.icontrols.iotplatform.utils.CommonUtils.isRestartAppForBackgroundWaitTime;
  42. import static kr.co.icontrols.iotplatform.utils.CommonUtils.resetBackgroundWaitTime;
  43. import static kr.co.icontrols.iotplatform.utils.CommonUtils.restartApp;
  44. import static kr.co.icontrols.iotplatform.utils.CommonUtils.setBackgroundWaitTime;
  45. import static kr.co.icontrols.iotplatform.utils.CommonUtils.showNotiMsg;
  46. import static kr.co.icontrols.iotplatform.utils.Constants.DEFAULT_RANK;
  47. import static kr.co.icontrols.iotplatform.utils.Constants.EXTRA_DEVICE_INFO;
  48. import static kr.co.icontrols.iotplatform.utils.Constants.EXTRA_DEVICE_LIST;
  49. import static kr.co.icontrols.iotplatform.utils.Constants.RESULT_CHANGE_GROUP_IMG;
  50. import static kr.co.icontrols.iotplatform.utils.Constants.RESULT_INPUT_GROUP_NAME;
  51. import static kr.co.icontrols.iotplatform.utils.Constants.RESULT_UPDATE_DATA;
  52. import static kr.co.icontrols.iotplatform.utils.HttpApi.HTTP_OK;
  53. public class DeviceActivity extends AppCompatActivity implements View.OnClickListener {
  54. private String TAG = "DeviceActivity";
  55. private ListView mListView;
  56. private DeviceListAdapter mDeviceListAdapter;
  57. private Handler mConnectedHandler;
  58. @Override
  59. protected void onCreate(Bundle savedInstanceState) {
  60. super.onCreate(savedInstanceState);
  61. setContentView(R.layout.activity_device);
  62. mListView = findViewById(R.id.listView);
  63. if(!UserInfo.confirmed) {
  64. showNotiMsg(this, "인증 후 사용 가능합니다.");
  65. } else if(isExpiredSession()) {
  66. getCognitoSession(new GetSessionCallback() {
  67. @Override
  68. public void successed() {
  69. getDeviceList();
  70. }
  71. @Override
  72. public void failed() {
  73. showNotiMsg(DeviceActivity.this, "세션을 갱신하지 못하였습니다.");
  74. System.exit(0);
  75. }
  76. });
  77. } else {
  78. getDeviceList();
  79. }
  80. mConnectedHandler = new Handler() {
  81. @Override
  82. public void handleMessage(@NonNull Message msg) {
  83. super.handleMessage(msg);
  84. WarnLogOutput(TAG, "mConnectedHandler : is mqtt connect ? " + MqttController.getInstance().isConneted());
  85. if(MqttController.getInstance().isConneted()) {
  86. if(mDeviceListAdapter != null) {
  87. MqttController.getInstance().allUnsubscribeToTopics();
  88. mDeviceListAdapter.notifyDataSetChanged();
  89. }
  90. } else {
  91. mConnectedHandler.sendEmptyMessageDelayed(1,1000);
  92. }
  93. }
  94. };
  95. }
  96. @Override
  97. protected void onResume() {
  98. super.onResume();
  99. if(isRestartAppForBackgroundWaitTime()) {
  100. restartApp(this);
  101. return;
  102. }
  103. if(mDeviceListAdapter != null) {
  104. MqttController.getInstance().allUnsubscribeToTopics();
  105. mDeviceListAdapter.notifyDataSetChanged();
  106. if(!MqttController.getInstance().isConneted()) {
  107. mConnectedHandler.sendEmptyMessageDelayed(1,1000);
  108. }
  109. }
  110. }
  111. @Override
  112. public void onBackPressed() {
  113. if(findViewById(R.id.layoutMore).getVisibility() == View.VISIBLE) {
  114. findViewById(R.id.layoutMore).setVisibility(View.GONE);
  115. } else {
  116. //super.onBackPressed();
  117. cancelToExit(this);
  118. }
  119. }
  120. @Override
  121. protected void onPause() {
  122. mConnectedHandler.removeCallbacksAndMessages(null);
  123. MqttController.getInstance().allUnsubscribeToTopics();
  124. ForceDismissConnectDialog();
  125. setBackgroundWaitTime();
  126. super.onPause();
  127. }
  128. @Override
  129. protected void onDestroy() {
  130. resetBackgroundWaitTime();
  131. super.onDestroy();
  132. }
  133. @Override
  134. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  135. super.onActivityResult(requestCode, resultCode, data);
  136. switch (requestCode) {
  137. case RESULT_UPDATE_DATA:
  138. if(resultCode == RESULT_OK) {
  139. MqttController.getInstance().allUnsubscribeToTopics();
  140. if(UserInfo.devices.size() == 0) {
  141. findViewById(R.id.layoutRegisterDevice).setVisibility(View.VISIBLE);
  142. findViewById(R.id.layoutDeviceList).setVisibility(View.GONE);
  143. } else {
  144. findViewById(R.id.layoutRegisterDevice).setVisibility(View.GONE);
  145. findViewById(R.id.layoutDeviceList).setVisibility(View.VISIBLE);
  146. mDeviceListAdapter.notifyDataSetChanged();
  147. UserInfo.deviceCount = UserInfo.devices.size();
  148. ((TextView)findViewById(R.id.txtDeviceCount)).setText(String.format(getString(R.string.string_format_device_count),UserInfo.deviceCount));
  149. }
  150. }
  151. break;
  152. }
  153. }
  154. @Override
  155. public void onClick(View v) {
  156. /*
  157. final View fv = v;
  158. fv.setEnabled(false);
  159. Timer buttonTimer = new Timer();
  160. buttonTimer.schedule(new TimerTask() {
  161. @Override
  162. public void run() {
  163. runOnUiThread(new Runnable() {
  164. @Override
  165. public void run() {
  166. try {
  167. fv.setEnabled(true);
  168. } catch (Exception e) {
  169. e.printStackTrace();
  170. } finally {
  171. }
  172. }
  173. });
  174. }
  175. }, 500);
  176. */
  177. if(!UserInfo.confirmed) {
  178. showNotiMsg(this, "인증 후 사용 가능합니다.");
  179. return;
  180. }
  181. switch (v.getId()) {
  182. case R.id.btnBack:
  183. onBackPressed();
  184. break;
  185. case R.id.btnRight2:
  186. findViewById(R.id.layoutMore).setVisibility(View.VISIBLE);
  187. break;
  188. case R.id.btnRight:
  189. case R.id.btnRegisterDevice:
  190. //startActivity(new Intent(this, AddDeviceListActivity.class));
  191. startActivity(new Intent(this,LightRegisterGuideActivity.class));
  192. break;
  193. case R.id.btnCloseMore:
  194. findViewById(R.id.layoutMore).setVisibility(View.GONE);
  195. break;
  196. case R.id.layoutMoreRank:
  197. if(UserInfo.devices.size() > 1) {
  198. Intent intent = new Intent(DeviceActivity.this, DeviceChangeRankActivity.class);
  199. intent.putExtra(EXTRA_DEVICE_LIST, UserInfo.devices);
  200. intent.putExtra("MODE","DEVICE_RANK");
  201. startActivity(intent);
  202. } else {
  203. showNotiMsg(DeviceActivity.this,"스마트 조명 갯수가 2개 이상에만 변경 가능합니다.");
  204. }
  205. findViewById(R.id.layoutMore).setVisibility(View.GONE);
  206. break;
  207. case R.id.layoutMoreDelete:
  208. if(UserInfo.devices.size() > 0) {
  209. UserInfo.setUnSelectAllDevices();
  210. Intent intent = new Intent(DeviceActivity.this, DeviceSelectActivity.class);
  211. intent.putExtra("MODE","AWS");
  212. intent.putExtra(EXTRA_DEVICE_LIST, UserInfo.devices);
  213. startActivityForResult(intent,RESULT_UPDATE_DATA);
  214. } else {
  215. showNotiMsg(DeviceActivity.this,"삭제할 스마트 조명이 존재하지 않습니다.");
  216. }
  217. findViewById(R.id.layoutMore).setVisibility(View.GONE);
  218. break;
  219. }
  220. }
  221. private void getDeviceList() {
  222. UserInfo.getDevice(this, new UserInfo.CallbackForUpdate() {
  223. @Override
  224. public void updateData() {
  225. runOnUiThread(new Runnable() {
  226. @Override
  227. public void run() {
  228. if(UserInfo.devices.size() == 0) {
  229. findViewById(R.id.layoutRegisterDevice).setVisibility(View.VISIBLE);
  230. findViewById(R.id.layoutDeviceList).setVisibility(View.GONE);
  231. } else {
  232. mDeviceListAdapter = new DeviceListAdapter(DeviceActivity.this, UserInfo.devices);
  233. mListView.setAdapter(mDeviceListAdapter);
  234. mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  235. @Override
  236. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  237. final DeviceInfo item = (DeviceInfo) parent.getItemAtPosition(position);
  238. Intent intent = new Intent(DeviceActivity.this,LightDetailActivity.class);
  239. intent.putExtra(EXTRA_DEVICE_INFO, (Parcelable) item);
  240. startActivityForResult(intent,RESULT_UPDATE_DATA);
  241. }
  242. });
  243. findViewById(R.id.layoutRegisterDevice).setVisibility(View.GONE);
  244. findViewById(R.id.layoutDeviceList).setVisibility(View.VISIBLE);
  245. ((TextView)findViewById(R.id.txtDeviceCount)).setText(String.format(getString(R.string.string_format_device_count),UserInfo.deviceCount));
  246. }
  247. }
  248. });
  249. }
  250. });
  251. /*
  252. UserInfo.devices.clear();
  253. displayProgress(this, null,null);
  254. try{
  255. HttpApi.getAllDevice(new Callback() {
  256. @Override
  257. public void onFailure(Call call, IOException e) {
  258. e.printStackTrace();
  259. ErrorLogOutput(TAG, "HttpApi.getAllDevice(onFailure)\n" + e.toString());
  260. DismissConnectDialog();
  261. }
  262. @Override
  263. public void onResponse(Call call, Response response) throws IOException {
  264. if(response.code() == HTTP_OK) {
  265. WarnLogOutput(TAG, "HttpApi.getAllDevice(onResponse) : HTTP_OK");
  266. try {
  267. JSONObject json_data = new JSONObject(response.body().string());
  268. UserInfo.deviceCount = json_data.isNull("count") ? 0 : json_data.getInt("count");
  269. if(UserInfo.deviceCount > 0) {
  270. JSONArray jarrayAll = new JSONArray(json_data.getString("results"));
  271. for (int i = 0; i < jarrayAll.length(); i++) {
  272. JSONObject jObject = jarrayAll.getJSONObject(i);
  273. DeviceInfo item = new DeviceInfo(
  274. jObject.isNull("deviceId") ? "" : jObject.getString("deviceId"),
  275. jObject.isNull("deviceType") ? "" : jObject.getString("deviceType"),
  276. jObject.isNull("friendlyName") ? "" : jObject.getString("friendlyName"),
  277. jObject.isNull("sharedFriendlyName") ? "" : jObject.getString("sharedFriendlyName"),
  278. jObject.isNull("dgroupId") ? "" : jObject.getString("dgroupId"),
  279. jObject.isNull("dgroupName") ? "" : jObject.getString("dgroupName"),
  280. jObject.isNull("ownerId") ? "" : jObject.getString("ownerId"),
  281. DEFAULT_RANK
  282. );
  283. DeviceInfo localDbItem = DBUtil.getDeviceInfoForId(TABLE_DEVICE_RANK, item.deviceId);
  284. if (localDbItem == null) {
  285. DBUtil.putDeviceInfo(TABLE_DEVICE_RANK, item);
  286. } else {
  287. item.rank = localDbItem.rank;
  288. DBUtil.updateDeviceItem(TABLE_DEVICE_RANK, item);
  289. }
  290. }
  291. ArrayList<DeviceInfo> deviceInfos = DBUtil.getAllDeviceInfos(TABLE_DEVICE_RANK);
  292. for (DeviceInfo d : deviceInfos) {
  293. UserInfo.devices.add(d);
  294. }
  295. deviceInfos.clear();
  296. }
  297. //UI 업데이트
  298. runOnUiThread(new Runnable() {
  299. @Override
  300. public void run() {
  301. if(UserInfo.devices.size() == 0) {
  302. findViewById(R.id.layoutRegisterDevice).setVisibility(View.VISIBLE);
  303. findViewById(R.id.layoutDeviceList).setVisibility(View.GONE);
  304. } else {
  305. findViewById(R.id.layoutRegisterDevice).setVisibility(View.GONE);
  306. findViewById(R.id.layoutDeviceList).setVisibility(View.VISIBLE);
  307. MqttController.getInstance().allUnsubscribeToTopics();
  308. mDeviceListAdapter.notifyDataSetChanged();
  309. ((TextView)findViewById(R.id.txtDeviceCount)).setText(String.format(getString(R.string.string_format_device_count),UserInfo.deviceCount));
  310. }
  311. DismissConnectDialog();
  312. }
  313. });
  314. } catch (JSONException e) {
  315. e.printStackTrace();
  316. ErrorLogOutput(TAG, "HttpApi.getAllDevice(JSONException)\n" + e.toString());
  317. DismissConnectDialog();
  318. }
  319. } else {
  320. ErrorLogOutput(TAG, "HttpApi.getAllDevice(onResponse) Error code : " + response.code() + "\nresponse : " + response.toString());
  321. DismissConnectDialog();
  322. try {
  323. JSONObject json_data = new JSONObject(response.body().string());
  324. ErrorLogOutput(TAG, "HttpApi.getAllDevice(onResponse) body : " + json_data.toString());
  325. } catch (JSONException e) {
  326. ErrorLogOutput(TAG, "HttpApi.getAllDevice(onResponse) JSONException : " + e.toString());
  327. }
  328. }
  329. }
  330. });
  331. } catch(Exception e){
  332. e.printStackTrace();
  333. ErrorLogOutput(TAG, "HttpApi.getDeviceListInDeviceGroup(Exception)\n" + e.toString());
  334. DismissConnectDialog();
  335. }
  336. */
  337. }
  338. }