update: add a timeout for socket connection (PanelConnection)
update: 1 refactor TCPConnection.Callback error to onError()
2 onError(), set isLoading to false, so next time connect will set ui correctly
3 myHandler now reset demoBtn to visible
update: socket condition check
update: panel connection now has read timeout , also loop does not check if in.available rather than check isListening() flag
 read() will timeout in 5 seconds if no response from panel
TCPConnection: 1 rxThread is a private field now and getter is synchronized
 2 tx thread now set isListening to true, start listinging
 3 rx thread now read() while isListening and will block
 4 socket creates with timeout 5000 and when enter multiSelection mode, timeout will be set to 0
 5 throw out exception if read() == -1,which  means panel has been reset
update: 1 add a PanelResetException in TCPConnection
2 TCPConnection callback onError now requires an exception as a parameter
update: 1 make PanelResetException static so other class can use it
 2 check if read() == -1 in PanelConnection. and throw PanelResetException
update: 1 add an error flag in PanelConnection
 2 in finally(), if error then break out of the loop
update:  PanelActivity now handles PanelResetException and indicator user with a toast.
update:  code refactor
update: add a Map<String,Boolean> ipEnableMap for enable or disable ip entry in the list dialog
in ListDialogFragment, when create view, it now checks the value in the ipEnableMap and disable it if it is false;
fix: device multi-selection, using valueAt(i) and keyAt(i) to iterate SparseIntArray
update catch SocketTimeoutException
fix: out and in are null while close connection on exception
fix: loop1 multi-selection and setListening to false
fix: panel list dialog fragment, onItemClick() now checks ipEnableMap, to prevent error
update:  connection time out increased to 10sec