浏览代码

[Kneet 3.0 Beta 0.1.1 Release]

aaron 9 年之前
父节点
当前提交
36e7a382d8

+ 1 - 1
gradle.properties

@@ -1,6 +1,6 @@
 org.gradle.daemon=true
 
-org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
 
 org.gradle.parallel=true
 

+ 12 - 2
kneet_v3/build.gradle

@@ -13,10 +13,20 @@ android {
         minSdkVersion 15
         targetSdkVersion 22
         multiDexEnabled true
-        versionCode 1
-        versionName "0.1.0"
+        versionCode 2
+        versionName "0.1.1"
     }
 
+    /*productFlavors {
+        dev {
+            minSdkVersion 21
+        }
+
+        prod {
+            minSdkVersion 15
+        }
+    }*/
+
     dexOptions {
         //preDexLibraries = false
         jumboMode = true

+ 0 - 13
kneet_v3/build/generated/source/buildConfig/androidTest/debug/com/ntels/kneet/v3/test/BuildConfig.java

@@ -1,13 +0,0 @@
-/**
- * Automatically generated file. DO NOT MODIFY
- */
-package com.ntels.kneet.v3.test;
-
-public final class BuildConfig {
-  public static final boolean DEBUG = Boolean.parseBoolean("true");
-  public static final String APPLICATION_ID = "com.ntels.kneet.v3.test";
-  public static final String BUILD_TYPE = "debug";
-  public static final String FLAVOR = "";
-  public static final int VERSION_CODE = 1;
-  public static final String VERSION_NAME = "0.1.0";
-}

+ 0 - 13
kneet_v3/build/generated/source/buildConfig/debug/com/ntels/kneet/v3/BuildConfig.java

@@ -1,13 +0,0 @@
-/**
- * Automatically generated file. DO NOT MODIFY
- */
-package com.ntels.kneet.v3;
-
-public final class BuildConfig {
-  public static final boolean DEBUG = Boolean.parseBoolean("true");
-  public static final String APPLICATION_ID = "com.ntels.kneet.v3";
-  public static final String BUILD_TYPE = "debug";
-  public static final String FLAVOR = "";
-  public static final int VERSION_CODE = 1;
-  public static final String VERSION_NAME = "0.1.0";
-}

+ 1 - 0
kneet_v3/src/main/AndroidManifest.xml

@@ -249,6 +249,7 @@
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                 <action android:name="android.net.wifi.STATE_CHANGE" />
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
             </intent-filter>
         </receiver>
         <receiver

+ 58 - 1
kneet_v3/src/main/java/com/ntels/kneet/v3/common/mdns/MdnsRegBroadcastRecevier.java

@@ -11,20 +11,26 @@ import android.content.Intent;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
+import android.os.HandlerThread;
 import android.util.Log;
+import android.os.Handler;
 
 import com.google.android.gms.common.api.GoogleApiClient;
 import com.ntels.kneet.v3.common.Constants;
+import com.ntels.kneet.v3.common.util.LogUtil;
 import com.ntels.kneet.v3.common.util.Util;
+import com.ntels.kneet.v3.common.websocket.WebSocketService;
 
 public class MdnsRegBroadcastRecevier extends BroadcastReceiver {
 
+    private static final String TAG = MdnsRegBroadcastRecevier.class.getSimpleName();
+
     Context mContext;
     Util util = new Util();
     /** 위치 클라인 트 */
     private GoogleApiClient mGoogleApiClient;
 
-    @Override public void onReceive(Context context, Intent intent) {
+    @Override public void onReceive(final Context context, Intent intent) {
 
         mContext = context;
 
@@ -46,6 +52,16 @@ public class MdnsRegBroadcastRecevier extends BroadcastReceiver {
                     break;
                 case WifiManager.WIFI_STATE_ENABLED:
                     Log.i("BOOTSVC", "WIFI STATE ENABLED");
+                    /*new Handler().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            ComponentName cn = new ComponentName(context.getPackageName(), WebSocketService.class.getName());
+                            ComponentName svcName = context.startService(new Intent().setComponent(cn));
+                            if ( svcName == null ) {
+                                Log.e(TAG, "Could not start WebSocketService " + cn.toString());
+                            }
+                        }
+                    }, 5000);*/
                     break;
                 case WifiManager.WIFI_STATE_ENABLING:
                     Log.i("BOOTSVC", "WIFI STATE ENABLING");
@@ -57,6 +73,7 @@ public class MdnsRegBroadcastRecevier extends BroadcastReceiver {
         } else if ( strAction.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION) ) {
             ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
             NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
+//            boolean bDisconnected = false;
 
             if ( null != activeNetwork ) {
                 if ( activeNetwork.getType() == ConnectivityManager.TYPE_WIFI ) {
@@ -72,10 +89,50 @@ public class MdnsRegBroadcastRecevier extends BroadcastReceiver {
                         }
                     } else if ( activeNetwork.getState() == NetworkInfo.State.DISCONNECTED ) {
                         Log.e("JINO TEST LOG", "JINO TEST LOG Network DISCONNECTED");
+//                        bDisconnected = true;
                     }
                 } else if ( activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE ) {
                     Log.e("JINO TEST LOG", "JINO TEST LOG Mobile CONNECTED");
                 }
+
+                /*if ( !bDisconnected ) {
+                    ComponentName cn = new ComponentName(context.getPackageName(), WebSocketService.class.getName());
+                    ComponentName svcName = context.startService(new Intent().setComponent(cn));
+                    if ( svcName == null ) {
+                        Log.e(TAG, "Could not start WebSocketService " + cn.toString());
+                    }
+                }*/
+            }
+        }
+
+        if ( strAction.equals(ConnectivityManager.CONNECTIVITY_ACTION) ) {
+            ConnectivityManager connectivityManager = (ConnectivityManager)
+                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
+            boolean networkEnable = false;
+
+            if ( connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null) {
+                if ( connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected() ) {
+                    LogUtil.i(TAG, "WiFi network is connected!!");
+                    networkEnable = true;
+                }
+            }
+            if ( connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null) {
+                if ( connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected() ) {
+                    LogUtil.i(TAG, "Mobile network is connected!!");
+                    networkEnable = true;
+                }
+            }
+            if ( networkEnable ) {
+                new Handler().postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        ComponentName cn = new ComponentName(context.getPackageName(), WebSocketService.class.getName());
+                        ComponentName svcName = context.startService(new Intent().setComponent(cn));
+                        if ( svcName == null ) {
+                            Log.e(TAG, "Could not start WebSocketService " + cn.toString());
+                        }
+                    }
+                }, 5000);
             }
         }
     }

+ 14 - 0
kneet_v3/src/main/java/com/ntels/kneet/v3/common/util/Util.java

@@ -14,6 +14,7 @@ import android.app.ActivityManager;
 import android.app.Dialog;
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -3479,4 +3480,17 @@ public class Util {
 
         return null;
     }
+
+    public String getTopActivityName(Context context) {
+        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningTaskInfo> info = activityManager.getRunningTasks(1);
+        ComponentName componentName = info.get(0).topActivity;
+
+        String activityName = componentName.getShortClassName().substring(1);
+        String packageName = componentName.getPackageName();
+        LogUtil.i(TAG, "Top activity name : " + activityName);
+        LogUtil.i(TAG, "Top package name : " + packageName);
+
+        return null2string(activityName);
+    }
 }

+ 14 - 0
kneet_v3/src/main/java/com/ntels/kneet/v3/common/websocket/WebSocketService.java

@@ -7,6 +7,7 @@ import android.os.IBinder;
 import android.os.Handler;
 import android.os.Message;
 
+import com.koushikdutta.async.callback.CompletedCallback;
 import com.koushikdutta.async.http.AsyncHttpClient;
 import com.koushikdutta.async.http.WebSocket;
 import com.ntels.kneet.v3.R;
@@ -45,6 +46,7 @@ public class WebSocketService extends Service {
     private Util util = new Util();
     private int iTempApiId = 0;
     private HashMap<String, Object> hmTempParam;
+    private boolean bFromUser = false;
 
     public WebSocketService() {
     }
@@ -149,6 +151,16 @@ public class WebSocketService extends Service {
                         });
                     }
                 });
+                ws.setClosedCallback(new CompletedCallback() {
+                    @Override
+                    public void onCompleted(Exception ex) {
+                        LogUtil.i(TAG, "Websocket closed!!");
+                        if ( !bFromUser ) {
+                            webSocketConnect();
+                        }
+                        bFromUser = false;
+                    }
+                });
                 webSocket = ws;
                 // WebSocket Client 인증 수행
                 handler.sendEmptyMessage(WEBSOCKET_CLIENT_AUTH);
@@ -162,6 +174,7 @@ public class WebSocketService extends Service {
             webSocket = null;
             webSocketResponses.clear();
             appConfig.setbWebSocketConn(false);
+            bFromUser = true;
         }
     }
 
@@ -170,6 +183,7 @@ public class WebSocketService extends Service {
             webSocket.close();
             webSocket = null;
             appConfig.setbWebSocketConn(false);
+            bFromUser = true;
         }
     }
 

+ 11 - 5
kneet_v3/src/main/java/com/ntels/kneet/v3/view/things/Fragment_Things.java

@@ -177,18 +177,21 @@ public class Fragment_Things extends Fragment implements View.OnClickListener,
 
         @Override
         public void onWebSocketError(int code, String message) {
+            if ( util.getTopActivityName(act).equals("view.things.Things_Detail") ) {
+                return;
+            }
             switch (code) {
                 case Constants.WEBSOCKET_ERROR_TIMEOUT:
-                    util.setShowToast(act, message, Toast.LENGTH_SHORT);
+//                    util.setShowToast(act, message, Toast.LENGTH_SHORT);
                     for (HashMap<String, Object> hm : alTotalList) {
                         hm.put(Constants.HTTP_request_time, "");
                     }
-                    setHomeHubStateList();
                     break;
                 case Constants.WEBSOCKET_ERROR_NOT_CONNECTED:
                     customDialog.MsgAlert(act, Constants.MSG807);
                     break;
             }
+            setHomeHubStateList();
         }
     };
 
@@ -526,6 +529,9 @@ public class Fragment_Things extends Fragment implements View.OnClickListener,
                 if ( !dataAdapter.getListCheck() ) {
                     if ( !loading ) {
                         onListReload();
+                        if ( !webSocketService.isWebSocketConnected() ) {
+                            webSocketService.webSocketConnect();
+                        }
                     }
                 } else {
                     swipeRefreshLayout.setRefreshing(false);
@@ -736,7 +742,7 @@ public class Fragment_Things extends Fragment implements View.OnClickListener,
             // 제어 요청 10초 후까지 응답이 없으면 타임아웃 처리.
             loadingHandler.sendEmptyMessageDelayed(loadingRow, 10000);
         } else {
-            util.setShowToast(act, util.getString(act, R.string.MSG807), Toast.LENGTH_SHORT);
+            util.setShowToast(act, util.getString(act, R.string.MSG836), Toast.LENGTH_SHORT);
         }
         setHomeHubStateList();
     }
@@ -1335,7 +1341,7 @@ public class Fragment_Things extends Fragment implements View.OnClickListener,
 
         if ( iCallType == 0 ) {
             //추가하기
-            sCall_HTTP_device_id = util.null2string(alTotalList.get(iPosition).get(Constants.HTTP_device_id));
+            sCall_HTTP_device_id = appConfig.getSelect_Homegrp_Homehub_Device_Id();
             Things_Device_Add();
         } else if ( iCallType == 1 ) {
             String sHTTP_cmdcls_code = util.null2string(alTotalList.get(iPosition).get(Constants.HTTP_cmdcls_code));
@@ -1437,7 +1443,7 @@ public class Fragment_Things extends Fragment implements View.OnClickListener,
         } else if ( iCallType == 3 ) {
             // 실행하기
             sCall_HTTP_request_value = dataAdapter.getHTTP_Value();
-            sCall_HTTP_device_id = util.null2string(alTotalList.get(iPosition).get(Constants.HTTP_device_id));
+            sCall_HTTP_device_id = appConfig.getSelect_Homegrp_Homehub_Device_Id();
             sCall_HTTP_node_id = util.null2string(alTotalList.get(iPosition).get(Constants.HTTP_node_id));
             sCall_HTTP_cmdcls_id = util.null2string(alTotalList.get(iPosition).get(Constants.HTTP_cmdcls_id));
             String sHTTP_content_value = util.null2string(alTotalList.get(iPosition).get(Constants.HTTP_content_value));

+ 3 - 0
kneet_v3/src/main/java/com/ntels/kneet/v3/view/things/Fragment_Things_Adapter.java

@@ -612,6 +612,9 @@ public class Fragment_Things_Adapter extends RecyclerView.Adapter<RecyclerView.V
                     vhItemView.llRowDelete.setVisibility(View.VISIBLE);
                     vhItemView.llRowOffline.setVisibility(View.GONE);
                     vhItemView.llLoading.setVisibility(View.GONE);
+                    if ( sHTTP_online_state.equals("OFF") || appConfig.getSelect_Homegrp_Homehub_Online_State().equals("OFF") ) {
+                        vhItemView.ivRowIcon.setBackgroundResource(R.drawable.img_thing_icon_bg_default);
+                    }
                 } else {
                     if ( sHTTP_online_state.equals("OFF") || appConfig.getSelect_Homegrp_Homehub_Online_State().equals("OFF") ) {
                         vhItemView.ivRowIcon.setBackgroundResource(R.drawable.img_thing_icon_bg_default);

+ 3 - 1
kneet_v3/src/main/java/com/ntels/kneet/v3/view/things/Things_Detail.java

@@ -283,6 +283,8 @@ public class Things_Detail extends CustomActionBarActivity implements View.OnCli
                     customDialog.MsgAlert(act, Constants.MSG807);
                     break;
             }
+            setNode_Disp();
+            setHomeHubStateList();
         }
     };
 
@@ -1580,7 +1582,7 @@ public class Things_Detail extends CustomActionBarActivity implements View.OnCli
             // 제어 요청 10초 후까지 응답이 없으면 타임아웃 처리.
             loadingHandler.sendEmptyMessageDelayed(loadingRow, 10000);
         } else {
-            util.setShowToast(act, util.getString(act, R.string.MSG807), Toast.LENGTH_SHORT);
+            util.setShowToast(act, util.getString(act, R.string.MSG836), Toast.LENGTH_SHORT);
         }
         setHomeHubStateList();
     }

+ 27 - 6
kneet_v3/src/main/java/com/ntels/kneet/v3/view/things/Things_Device_Add_01.java

@@ -405,13 +405,35 @@ public class Things_Device_Add_01 extends CustomActivity implements View.OnClick
     private void send_WS_device_command() {
         HashMap<String, Object> sendParams = new HashMap<>();
         sendParams.put(Constants.WEBSOCKET_KEY_MESSAGE_TYPE, Constants.WEBSOCKET_TYPE_DEVICE_COMMAND);
-        sendParams.put(Constants.WEBSOCKET_KEY_DEVICE_ID, sDEVICE_ID);
+        sendParams.put(Constants.WEBSOCKET_KEY_DEVICE_ID, appConfig.getSelect_Homegrp_Homehub_Device_Id());
         sendParams.put(Constants.WEBSOCKET_KEY_COMMAND_TYPE, Constants.WEBSOCKET_COMM_TYPE_PAIRING_START);
         sendParams.put(Constants.WEBSOCKET_KEY_REQUEST_ID, appConfig.getiSelect_Servicehub_Request_Id());
 
         webSocketService.send(Constants.WEBSOCKET_SEND_DEVICE_COMMAND, sendParams);
     }
 
+    /**
+     * <PRE>
+     * 1. MethodName: result_WS_device_command
+     * 2. ClassName :
+     * 3. Comment   : [Result]서비스 허브에 디바이스 제어(노드 페어링 모드)를 요청한다.
+     * 4. Developer : 정백호
+     * 5. Created   : 2016. 07.
+     * </PRE>
+     */
+    private void result_WS_device_command_result(JSONObject joResult) {
+        try {
+            if ( !joResult.get(Constants.WEBSOCKET_KEY_RESULT_CODE).equals("00") ) {
+                LogUtil.i(TAG, joResult.getString(Constants.WEBSOCKET_KEY_RESULT_MSG));
+                customDialog.MsgAlert(act, Constants.MSG836);
+                util.getView(act, R.id.llBtn1).setEnabled(true);
+                util.getView(act, R.id.btnReStart).setEnabled(true);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+
     /**
      * <PRE>
      * 1. MethodName: notification_WS_device_command_result
@@ -433,7 +455,7 @@ public class Things_Device_Add_01 extends CustomActivity implements View.OnClick
                 intent.putExtra(Constants.EXTRA_DEVICE_DESC1, sDEVICE_DESC1);
                 intent.putExtra(Constants.EXTRA_DEVICE_IMAGE1, iDEVICE_IMAGE1);
                 intent.putExtra(Constants.EXTRA_COMMAND_ID, sHTTP_command_id);
-                intent.putExtra(Constants.EXTRA_DEVICE_ID, sDEVICE_ID);
+                intent.putExtra(Constants.EXTRA_DEVICE_ID, appConfig.getSelect_Homegrp_Homehub_Device_Id());
                 util.callActivityForResultNoAnim(act, intent, Constants.ACT_THINGS_DEVICE_ADD_02);
             } else {
                 Dlog.v(joResult.toString());
@@ -455,12 +477,9 @@ public class Things_Device_Add_01 extends CustomActivity implements View.OnClick
         } catch (Exception ex) {
             ex.printStackTrace();
             customDialog.MsgAlert(act, Constants.MSG807);
-        }
-        try {
+        } finally {
             util.getView(act, R.id.llBtn1).setEnabled(true);
             util.getView(act, R.id.btnReStart).setEnabled(true);
-        } catch (Exception ex) {
-
         }
     }
 
@@ -499,6 +518,8 @@ public class Things_Device_Add_01 extends CustomActivity implements View.OnClick
 
                 if ( messageType.equals(Constants.WEBSOCKET_TYPE_DEVICE_COMMAND_RESULT) ) {
                     notification_WS_device_command_result(jsonObject);
+                } else if ( messageType.equals(Constants.WEBSOCKET_TYPE_DEVICE_COMMAND) ) {
+                    result_WS_device_command_result(jsonObject);
                 } else if ( messageType.equals(Constants.WEBSOCKET_TYPE_NODE_CONTENT) ) {
                 } else {
                     /*final String finalResultMsg = resultMsg;

+ 7 - 0
kneet_v3/src/main/java/com/ntels/kneet/v3/view/things/Things_Homehub_Register.java

@@ -325,6 +325,13 @@ public class Things_Homehub_Register extends CustomActivity implements View.OnCl
         }
 
         public void addItem(HashMap<String, Object> item) {
+            LogUtil.i(TAG, "addItem : " + item.toString());
+            for (HashMap<String, Object> hm : alHomehubList) {
+                if (hm.get(Constants.MDNS_KEY_INFO_SERIAL_NUMBER)
+                        .equals(item.get(Constants.MDNS_KEY_INFO_SERIAL_NUMBER))) {
+                    return;
+                }
+            }
             alHomehubList.add(item);
             send_G_devices_mf_id_model_id_sn(item, getItemCount() - 1);
 //            util.getView(act, R.id.rvHomhubList).setVisibility(View.VISIBLE);

+ 2 - 1
kneet_v3/src/main/res/values-en/strings_layout.xml

@@ -319,7 +319,8 @@
     <string name="layout_things_device_add_del_10"><![CDATA["Open the sensor case and press the pin once."]]></string>
     <string name="layout_things_device_add_del_11"><![CDATA["Press the button of the sensor once. When the indicator stops blinking, press it one more time."]]></string>
     <string name="layout_things_device_add_del_12"><![CDATA["Press the button of the sensor once."]]></string>
-    <string name="layout_things_device_add_del_13"><![CDATA["Follow the process described in the user's manual.\n*For the best results, it is recommended to pair the device within 3 meters of your Home Hub."]]></string>
+    <string name="layout_things_device_add_del_13"><![CDATA["For a generic Z-Wave device not in the Add thing list,\nplease refer to the device's user manual to proceed."]]></string>
+    <!--<string name="layout_things_device_add_del_13"><![CDATA["Follow the process described in the user's manual.\n*For the best results, it is recommended to pair the device within 3 meters of your Home Hub."]]></string>-->
     <string name="layout_things_device_add_del_14"><![CDATA["Follow the inclusion process as described in the user's manual."]]></string>
     <string name="layout_things_device_add_del_15"><![CDATA["Follow the exclusion process as described in the user's manual."]]></string>
 

+ 1 - 1
kneet_v3/src/main/res/values/strings_layout.xml

@@ -319,7 +319,7 @@
     <string name="layout_things_device_add_del_10"><![CDATA["센서 케이스를 열고 핀을 1회 누르세요"]]></string>
     <string name="layout_things_device_add_del_11"><![CDATA["센서 아래의 버튼을 1회 누른 후, LED가 깜박임을 멈추면 1회 더 누르세요"]]></string>
     <string name="layout_things_device_add_del_12"><![CDATA["센서 아래의 버튼을 1회 누르세요"]]></string>
-    <string name="layout_things_device_add_del_13"><![CDATA["장치 메뉴얼을 참고해서 진행하세요.\n* 이 화면을 통해 장치를 추가할 경우,\n일부 기능이 나타나지 않거나\n정상적으로 추가되지 않을 수 있습니다."]]></string>
+    <string name="layout_things_device_add_del_13"><![CDATA["해당 장치 매뉴얼을 참고하여 진행하세요.\n* 기타 장치일 경우, 정상 진행이 안 될 수도 있습니다."]]></string>
     <string name="layout_things_device_add_del_14"><![CDATA["장치 메뉴얼에 기재된 연결(Inclusion) 동작을 시작하세요"]]></string>
     <string name="layout_things_device_add_del_15"><![CDATA["장치 메뉴얼에 기재된 연결해제(Exclusion) 동작을 시작하세요"]]></string>