[SSM] Fix IOT-332, 333, 334 issues
[platform/upstream/iotivity.git] / service / soft-sensor-manager / SampleApp / android / SSMTesterApp / src / org / iotivity / service / ssm / sample / MainActivity.java
1 package org.iotivity.service.ssm.sample;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.OutputStream;
7 import java.util.ArrayList;
8 import java.util.Iterator;
9 import java.util.List;
10 import java.util.UUID;
11
12 import org.iotivity.service.ssm.DataReader;
13 import org.iotivity.service.ssm.IQueryEngineEvent;
14 import org.iotivity.service.ssm.ModelData;
15 import org.iotivity.service.ssm.R;
16 import org.iotivity.service.ssm.SSMInterface;
17
18 import android.app.Activity;
19 import android.content.Context;
20 import android.content.SharedPreferences;
21 import android.content.SharedPreferences.Editor;
22 import android.content.res.AssetManager;
23 import android.os.Bundle;
24 import android.os.Handler;
25 import android.os.Message;
26 import android.util.Log;
27 import android.view.View;
28 import android.widget.EditText;
29 import android.widget.ScrollView;
30 import android.widget.TextView;
31
32 public class MainActivity extends Activity {
33
34         private SSMInterface SoftSensorManager = null;
35         private ArrayList<Integer> mRunningQueries = new ArrayList<Integer>();
36
37         private IQueryEngineEvent mQueryEngineEventListener = new IQueryEngineEvent() {
38                 @Override
39                 public void OnQueryEngineEvent(int cqid, DataReader result) {
40                         Log.i("[SSM]", "event received! cqid=" + cqid);
41                         PrintLog("Event from cqid " + cqid + " has received");
42
43                         List<String> models = result.GetAffectedModels();
44
45                         for (String modelName : models) {
46                                 PrintLog("Model: " + modelName);
47                                 try {
48                                         int dataCount = result.GetModelDataCount(modelName);
49                                         for (int i = 0; i < dataCount; i++) {
50                                                 ModelData modelData = result.GetModelData(modelName, i);
51                                                 for (int j = 0; j < modelData.GetPropertyCount(); j++) {
52                                                         PrintLog("Name: " + modelData.GetPropertyName(j)
53                                                                         + " Value: "
54                                                                         + modelData.GetPropertyValue(j));
55                                                 }
56                                         }
57                                 } catch (Exception e) {
58                                         e.printStackTrace();
59                                         PrintLog("Receiving Event from cqid " + cqid + " failed");
60                                 }
61                         }
62                 }
63         };
64
65         void PrintLog(String log) {
66                 Message msg = new Message();
67                 Bundle data = new Bundle();
68                 data.putString("Log", log);
69                 msg.setData(data);
70                 logHandler.sendMessage(msg);
71         }
72
73         private Handler logHandler = new Handler() {
74                 @Override
75                 public void handleMessage(Message msg) {
76                         tvLog.append(msg.getData().getString("Log") + "\n");
77                         svLog.fullScroll(ScrollView.FOCUS_DOWN);
78                 }
79         };
80
81         private TextView tvLog = null;
82         private ScrollView svLog = null;
83         private EditText edtQuery = null;
84         private EditText edtUnregisterQuery = null;
85
86         View.OnClickListener clickHandler = new View.OnClickListener() {
87
88                 public void onClick(View v) {
89                         switch (v.getId()) {
90                         case R.id.btnRegisterQuery:
91                                 int cqid = 0;
92                                 try {
93                                         cqid = SoftSensorManager.registerQuery(edtQuery.getText()
94                                                         .toString(), mQueryEngineEventListener);
95                                         mRunningQueries.add(cqid);
96                                         PrintLog(edtQuery.getText().toString()
97                                                         + " has executed, cqid=" + cqid);
98                                 } catch (Exception e) {
99                                         PrintLog("Register Query failed");
100                                 }
101
102                                 break;
103
104                         case R.id.btnUnregisterQuery:
105                                 Iterator<Integer> it = mRunningQueries.iterator();
106
107                                 while (it.hasNext()) {
108                                         if (it.next() == Integer.parseInt(edtUnregisterQuery
109                                                         .getText().toString())) {
110                                                 try {
111                                                         SoftSensorManager.unregisterQuery(Integer
112                                                                         .parseInt(edtUnregisterQuery.getText()
113                                                                                         .toString()));
114                                                         PrintLog("Unregister Query has executed, cqid="
115                                                                         + Integer.parseInt(edtUnregisterQuery
116                                                                                         .getText().toString()));
117                                                         it.remove();
118                                                 } catch (NumberFormatException e) {
119                                                         PrintLog("Invalid Query Id");
120                                                 } catch (Exception e) {
121                                                         PrintLog("UnRegister Query failed");
122                                                 }
123                                                 break;
124                                         }
125                                 }
126                                 break;
127
128                         case R.id.btPlus:
129                                 int queryNum = Integer.parseInt(edtUnregisterQuery.getText()
130                                                 .toString()) + 1;
131                                 edtUnregisterQuery.setText(queryNum + "");
132                                 break;
133
134                         case R.id.btMinus:
135                                 queryNum = Integer.parseInt(edtUnregisterQuery.getText()
136                                                 .toString()) - 1;
137                                 edtUnregisterQuery.setText(queryNum + "");
138                                 break;
139                         }
140                 }
141         };
142
143         View.OnClickListener textAddHandler = new View.OnClickListener() {
144
145                 public void onClick(View v) {
146                         switch (v.getId()) {
147                         case R.id.btClear:
148                                 edtQuery.setText("");
149                                 break;
150
151                         case R.id.btLogClear:
152                                 tvLog.setText("");
153                                 break;
154
155                         case R.id.btFullDevice:
156                                 edtQuery.setText("subscribe Device if Device.dataId != 0");
157                                 break;
158
159                         case R.id.btDiscomfortIndex:
160                                 edtQuery.setText("subscribe Device.DiscomfortIndexSensor if Device.DiscomfortIndexSensor.discomfortIndex > 0");
161                                 break;
162                         }
163                 }
164         };
165
166         @Override
167         public void onCreate(Bundle savedInstanceState) {
168                 super.onCreate(savedInstanceState);
169                 setContentView(R.layout.activity_main);
170
171                 tvLog = (TextView) findViewById(R.id.txtLog);
172                 svLog = (ScrollView) findViewById(R.id.sclLog);
173                 edtQuery = (EditText) findViewById(R.id.editQuery);
174                 edtUnregisterQuery = (EditText) findViewById(R.id.editUnregisterQuery);
175
176                 findViewById(R.id.btnRegisterQuery).setOnClickListener(clickHandler);
177                 findViewById(R.id.btnUnregisterQuery).setOnClickListener(clickHandler);
178                 findViewById(R.id.btFullDevice).setOnClickListener(textAddHandler);
179                 findViewById(R.id.btDiscomfortIndex).setOnClickListener(textAddHandler);
180                 findViewById(R.id.btPlus).setOnClickListener(clickHandler);
181                 findViewById(R.id.btMinus).setOnClickListener(clickHandler);
182                 findViewById(R.id.btClear).setOnClickListener(textAddHandler);
183                 findViewById(R.id.btLogClear).setOnClickListener(textAddHandler);
184
185                 copyFiles("lib");
186
187                 SoftSensorManager = new SSMInterface();
188
189                 String initConfig = "<SSMCore>" + "<Device>" + "<UDN>" + getUUID()
190                                 + "</UDN>" + "<Name>MyMobile</Name>" + "<Type>Mobile</Type>"
191                                 + "</Device>" + "<Config>"
192                                 + "<SoftSensorRepository>/data/data/" + getPackageName()
193                                 + "/files/</SoftSensorRepository>"
194                                 + "<SoftSensorDescription>/data/data/" + getPackageName()
195                                 + "/files/SoftSensorDescription.xml</SoftSensorDescription>"
196                                 + "</Config>" + "</SSMCore>";
197
198                 try {
199                         SoftSensorManager.startSSMCore(initConfig);
200                 } catch (Exception e) {
201                         e.printStackTrace();
202                 }
203         }
204
205         @Override
206         protected void onDestroy() {
207                 try {
208                         SoftSensorManager.stopSSMCore();
209                 } catch (Exception e) {
210                         e.printStackTrace();
211                 }
212
213                 super.onDestroy();
214         }
215
216         private String getUUID() {
217                 String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
218                 SharedPreferences sharedPrefs = getSharedPreferences(PREF_UNIQUE_ID,
219                                 Context.MODE_PRIVATE);
220                 String uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
221
222                 if (uniqueID == null) {
223                         uniqueID = UUID.randomUUID().toString();
224                         Editor editor = sharedPrefs.edit();
225                         editor.putString(PREF_UNIQUE_ID, uniqueID);
226                         editor.commit();
227                 }
228
229                 return uniqueID;
230         }
231
232         private void copyFiles(String path) {
233                 AssetManager assetManager = getAssets();
234                 String assets[] = null;
235
236                 try {
237                         assets = assetManager.list(path);
238
239                         if (assets.length == 0) {
240                                 copyFile(path);
241                         } else {
242                                 String fullPath = "/data/data/"
243                                                 + this.getClass().getPackage().toString() + "/" + path;
244                                 File dir = new File(fullPath);
245
246                                 if (!dir.exists())
247                                         dir.mkdir();
248                                 for (int i = 0; i < assets.length; ++i) {
249                                         copyFiles(path + "/" + assets[i]);
250                                 }
251                         }
252                 } catch (IOException ex) {
253                         Log.e("tag", "I/O Exception", ex);
254                 }
255         }
256
257         private void copyFile(String filename) {
258                 AssetManager assetManager = getAssets();
259                 InputStream in = null;
260                 OutputStream out = null;
261
262                 try {
263                         in = assetManager.open(filename);
264                         out = openFileOutput(filename.split("/")[1], Context.MODE_PRIVATE);
265
266                         byte[] buffer = new byte[1024];
267                         int read;
268
269                         while ((read = in.read(buffer)) != -1) {
270                                 out.write(buffer, 0, read);
271                         }
272
273                         in.close();
274                         in = null;
275                         out.flush();
276                         out.close();
277                         out = null;
278                 } catch (Exception e) {
279                         Log.e("tag", e.getMessage());
280                 }
281         }
282 }