Added connectivity files for full code review
[platform/upstream/iotivity.git] / resource / csdk / connectivity / samples / android / sample_service / src / com / iotivity / service / MainActivity.java
1 package com.iotivity.service;
2
3 import java.util.ArrayList;
4
5 import android.app.Activity;
6 import android.app.AlertDialog;
7 import android.content.DialogInterface;
8 import android.os.Bundle;
9 import android.os.Handler;
10 import android.view.Menu;
11 import android.view.MenuItem;
12 import android.view.View;
13 import android.view.View.OnClickListener;
14 import android.widget.Button;
15 import android.widget.EditText;
16 import android.widget.RelativeLayout;
17 import android.widget.TextView;
18
19 import com.iotivity.sample_service.R;
20
21 public class MainActivity extends Activity {
22
23     static RMInterface RM = new RMInterface();
24
25     private final static String TAG = "MainActivity";
26
27     private final CharSequence[] mCheckBoxItems = { Network.WIFI.name(),
28             Network.EDR.name(), Network.LE.name() };
29
30     private final CharSequence[] mDTLSCheckBoxItems = { DTLS.SECURED.name(),
31             DTLS.UNSECURED.name() };
32
33     private final CharSequence[] mMsgTyleCheckBoxItems = { MsgType.CON.name(),
34             MsgType.NON.name() };
35
36     private enum Mode {
37         SERVER, CLIENT, BOTH, UNKNOWN
38     };
39
40     private enum Network {
41         WIFI, EDR, LE
42     };
43
44     private enum DTLS {
45         SECURED, UNSECURED
46     };
47
48     private enum MsgType {
49         CON, NON
50     };
51
52     private Mode mCurrentMode = Mode.UNKNOWN;
53
54     private ArrayList<Integer> mSelectedItems = new ArrayList<Integer>();
55
56     private RelativeLayout mFindResourceLayout = null;
57
58     private RelativeLayout mSendNotificationLayout = null;
59
60     private RelativeLayout mSendRequestLayout = null;
61
62     private RelativeLayout mSendRequestSettingLayout = null;
63
64     private RelativeLayout mSendResponseNotiSettingLayout = null;
65
66     private RelativeLayout mReceiveLayout = null;
67
68     private RelativeLayout mFindTitleLayout = null;
69
70     private RelativeLayout mRequestTitleLayout = null;
71
72     private RelativeLayout mResponseNotificationTitleLayout = null;
73
74     private RelativeLayout mAdvertiseTitleLayout = null;
75
76     private RelativeLayout mHandleTitleLayout = null;
77
78     private RelativeLayout mPayLoadClientEditLayout = null;
79
80     private RelativeLayout mPayLoadServerEditLayout = null;
81
82     private RelativeLayout mAdvertiseResourceLayout = null;
83
84     private RelativeLayout mServerButtonLayout = null;
85
86     private TextView mMode_tv = null;
87
88     private TextView mNetwork_tv = null;
89
90     private EditText mUri_ed = null;
91
92     private EditText mNotification_ed = null;
93
94     private EditText mReqData_ed = null;
95
96     private EditText mPayload_ed = null;
97
98     private Button mFind_btn = null;
99
100     private Button mNotify_btn = null;
101
102     private Button mAdvertiseResource_btn = null;
103
104     private Button mReqeust_btn = null;
105
106     private Button mReqeust_setting_btn = null;
107
108     private Button mResponse_Notify_setting_btn = null;
109
110     private Button mResponse_btn = null;
111
112     private Button mRecv_btn = null;
113
114     private Handler mLogHandler = null;
115
116     /**
117      * Defined ConnectivityType in cacommon.c
118      *
119      * CA_ETHERNET = (1 << 0) CA_WIFI = (1 << 1) CA_EDR = (1 << 2) CA_LE = (1 <<
120      * 3)
121      */
122     private int CA_WIFI = (1 << 1);
123     private int CA_EDR = (1 << 2);
124     private int CA_LE = (1 << 3);
125     private int isSecured = 0;
126     private int msgType = 0;
127     private int selectedItem = 0;
128     int selectedNetwork = 0;
129
130     @Override
131     protected void onCreate(Bundle savedInstanceState) {
132         super.onCreate(savedInstanceState);
133         setContentView(R.layout.activity_main);
134
135         RM.setResponseListener(this);
136
137         mLogHandler = new Handler();
138         TextView logView = (TextView) findViewById(R.id.tv_result);
139         DLog.setTextView(mLogHandler, logView);
140
141         // Initialize UI
142         // common
143         mReceiveLayout = (RelativeLayout) findViewById(R.id.layout_receive);
144
145         // client
146         mSendRequestLayout = (RelativeLayout) findViewById(R.id.layout_request);
147         mSendRequestSettingLayout = (RelativeLayout)
148                 findViewById(R.id.layout_request_setting_for_client);
149         mFindResourceLayout = (RelativeLayout) findViewById(R.id.layout_find);
150         mFindTitleLayout = (RelativeLayout) findViewById(R.id.layout_find_title);
151         mRequestTitleLayout = (RelativeLayout) findViewById(R.id.layout_request_title);
152         mHandleTitleLayout = (RelativeLayout) findViewById(R.id.layout_handle_title);
153         mPayLoadClientEditLayout = (RelativeLayout) findViewById(R.id.layout_payload_client_ed);
154
155         // server
156         mSendNotificationLayout = (RelativeLayout) findViewById(R.id.layout_notify);
157         mPayLoadServerEditLayout = (RelativeLayout) findViewById(R.id.layout_payload_server_ed);
158         mSendResponseNotiSettingLayout = (RelativeLayout)
159                 findViewById(R.id.layout_request_setting_for_server);
160         mServerButtonLayout = (RelativeLayout) findViewById(R.id.layout_server_bt);
161         mResponseNotificationTitleLayout = (RelativeLayout)
162                 findViewById(R.id.layout_Response_Noti_title);
163         mAdvertiseTitleLayout = (RelativeLayout) findViewById(R.id.layout_advertise_title);
164         mAdvertiseResourceLayout = (RelativeLayout) findViewById(R.id.layout_advertise_resource);
165
166         mMode_tv = (TextView) findViewById(R.id.tv_mode);
167         mNetwork_tv = (TextView) findViewById(R.id.tv_network);
168
169         mUri_ed = (EditText) findViewById(R.id.et_uri);
170         mNotification_ed = (EditText) findViewById(R.id.et_notification);
171         mReqData_ed = (EditText) findViewById(R.id.et_req_data);
172         mPayload_ed = (EditText) findViewById(R.id.et_payload_data_for_server);
173
174         mFind_btn = (Button) findViewById(R.id.btn_find_resource);
175         mResponse_btn = (Button) findViewById(R.id.btn_sendresponse);
176         mNotify_btn = (Button) findViewById(R.id.btn_notify);
177         mAdvertiseResource_btn = (Button) findViewById(R.id.btn_advertise);
178         mReqeust_btn = (Button) findViewById(R.id.btn_Request);
179         mReqeust_setting_btn = (Button) findViewById(R.id.btn_Request_setting_for_client);
180         mResponse_Notify_setting_btn = (Button)
181                 findViewById(R.id.btn_Request_setting_for_server);
182         mRecv_btn = (Button) findViewById(R.id.btn_receive);
183
184         mFind_btn.setOnClickListener(mFindResourceHandler);
185         mResponse_btn.setOnClickListener(mSendResponseHandler);
186         mNotify_btn.setOnClickListener(mNotifyHandler);
187         mAdvertiseResource_btn.setOnClickListener(mAdvertiseResourceHandler);
188         mReqeust_btn.setOnClickListener(mSendRequestHandler);
189         mReqeust_setting_btn.setOnClickListener(mSendRequestSettingHandler);
190         mResponse_Notify_setting_btn
191                 .setOnClickListener(mSendResponseNotiSettingHandler);
192         mRecv_btn.setOnClickListener(mResponseHandler);
193
194         showSelectModeView();
195
196         // Initialize Connectivity Abstraction
197         RM.RMInitialize(getApplicationContext());
198         // Select default network(WIFI)
199         RM.RMSelectNetwork(CA_WIFI);
200         // set handler
201         RM.RMRegisterHandler();
202     }
203
204     private void showSelectModeView() {
205
206         mFindResourceLayout.setVisibility(View.INVISIBLE);
207         mSendNotificationLayout.setVisibility(View.INVISIBLE);
208         mSendRequestLayout.setVisibility(View.INVISIBLE);
209         mSendRequestSettingLayout.setVisibility(View.INVISIBLE);
210         mReceiveLayout.setVisibility(View.INVISIBLE);
211         mFindTitleLayout.setVisibility(View.INVISIBLE);
212         mRequestTitleLayout.setVisibility(View.INVISIBLE);
213         mHandleTitleLayout.setVisibility(View.INVISIBLE);
214         mPayLoadClientEditLayout.setVisibility(View.INVISIBLE);
215         mPayLoadServerEditLayout.setVisibility(View.INVISIBLE);
216         mServerButtonLayout.setVisibility(View.INVISIBLE);
217         mResponseNotificationTitleLayout.setVisibility(View.INVISIBLE);
218         mAdvertiseTitleLayout.setVisibility(View.INVISIBLE);
219         mAdvertiseResourceLayout.setVisibility(View.INVISIBLE);
220         mSendResponseNotiSettingLayout.setVisibility(View.INVISIBLE);
221
222         mMode_tv.setText("Select Mode (Server or Client)");
223     }
224
225     private void showNetworkView() {
226
227         mNetwork_tv.setText("Select Network Type");
228     }
229
230     private void showModeView() {
231
232         if (mCurrentMode == Mode.SERVER) {
233
234             mFindResourceLayout.setVisibility(View.INVISIBLE);
235             mSendNotificationLayout.setVisibility(View.VISIBLE);
236             mSendRequestLayout.setVisibility(View.INVISIBLE);
237             mSendRequestSettingLayout.setVisibility(View.INVISIBLE);
238             mReceiveLayout.setVisibility(View.VISIBLE);
239
240             mFindTitleLayout.setVisibility(View.INVISIBLE);
241             mRequestTitleLayout.setVisibility(View.INVISIBLE);
242             mHandleTitleLayout.setVisibility(View.VISIBLE);
243             mPayLoadClientEditLayout.setVisibility(View.INVISIBLE);
244
245             mPayLoadServerEditLayout.setVisibility(View.VISIBLE);
246             mServerButtonLayout.setVisibility(View.VISIBLE);
247
248             mResponseNotificationTitleLayout.setVisibility(View.VISIBLE);
249             mAdvertiseTitleLayout.setVisibility(View.VISIBLE);
250             mAdvertiseResourceLayout.setVisibility(View.VISIBLE);
251
252             mSendResponseNotiSettingLayout.setVisibility(View.VISIBLE);
253
254             mNetwork_tv.setText("");
255
256         } else if (mCurrentMode == Mode.CLIENT) {
257
258             mFindResourceLayout.setVisibility(View.VISIBLE);
259             mSendNotificationLayout.setVisibility(View.INVISIBLE);
260             mSendRequestLayout.setVisibility(View.VISIBLE);
261             mSendRequestSettingLayout.setVisibility(View.VISIBLE);
262             mReceiveLayout.setVisibility(View.VISIBLE);
263
264             mFindTitleLayout.setVisibility(View.VISIBLE);
265             mRequestTitleLayout.setVisibility(View.VISIBLE);
266             mHandleTitleLayout.setVisibility(View.VISIBLE);
267             mPayLoadClientEditLayout.setVisibility(View.VISIBLE);
268
269             mPayLoadServerEditLayout.setVisibility(View.INVISIBLE);
270             mServerButtonLayout.setVisibility(View.INVISIBLE);
271
272             mResponseNotificationTitleLayout.setVisibility(View.INVISIBLE);
273             mAdvertiseTitleLayout.setVisibility(View.INVISIBLE);
274             mAdvertiseResourceLayout.setVisibility(View.INVISIBLE);
275
276             mSendResponseNotiSettingLayout.setVisibility(View.INVISIBLE);
277
278             mNetwork_tv.setText("");
279         }
280     }
281
282     @Override
283     protected void onDestroy() {
284         super.onDestroy();
285
286         // Terminate Connectivity Abstraction
287         RM.RMTerminate();
288         android.os.Process.killProcess(android.os.Process.myPid());
289     }
290
291     @Override
292     public boolean onCreateOptionsMenu(Menu menu) {
293
294         menu.add(0, 1, Menu.NONE, "Start Server");
295         menu.add(0, 2, Menu.NONE, "Start Client");
296         menu.add(0, 3, Menu.NONE, "Select Network");
297
298         return true;
299     }
300
301     @Override
302     public boolean onOptionsItemSelected(MenuItem item) {
303
304         switch (item.getItemId()) {
305
306         case 1:
307
308             RM.RMStartListeningServer();
309
310             if (mSelectedItems.size() == 0) {
311                 mCurrentMode = Mode.SERVER;
312                 mMode_tv.setText("MODE: " + mCurrentMode.toString());
313                 showNetworkView();
314
315             } else {
316                 mCurrentMode = Mode.SERVER;
317                 mMode_tv.setText("MODE: " + mCurrentMode.toString());
318                 showModeView();
319             }
320
321             break;
322
323         case 2:
324
325             RM.RMStartDiscoveryServer();
326
327             if (mSelectedItems.size() == 0) {
328                 mCurrentMode = Mode.CLIENT;
329                 mMode_tv.setText("MODE: " + mCurrentMode.toString());
330                 showNetworkView();
331
332             } else {
333                 mCurrentMode = Mode.CLIENT;
334                 mMode_tv.setText("MODE: " + mCurrentMode.toString());
335                 showModeView();
336             }
337
338             break;
339
340         case 3:
341
342             showAlertDialog("Select Network");
343
344             break;
345         }
346
347         return super.onOptionsItemSelected(item);
348     }
349
350     private OnClickListener mFindResourceHandler = new OnClickListener() {
351
352         @Override
353         public void onClick(View v) {
354
355             DLog.v(TAG, "FindResource click");
356             RM.RMFindResource(mUri_ed.getText().toString());
357
358         }
359     };
360
361     private OnClickListener mSendResponseHandler = new OnClickListener() {
362
363         @Override
364         public void onClick(View v) {
365
366             DLog.v(TAG, "SendResponse click");
367             RM.RMSendResponse(mNotification_ed.getText().toString(),
368                     mPayload_ed.getText().toString(), selectedNetwork,
369                     isSecured);
370         }
371     };
372
373     private OnClickListener mNotifyHandler = new OnClickListener() {
374
375         @Override
376         public void onClick(View v) {
377
378             DLog.v(TAG, "SendNotification click");
379             RM.RMSendNotification(mNotification_ed.getText().toString(),
380                     mPayload_ed.getText().toString(), selectedNetwork,
381                     isSecured);
382         }
383     };
384
385     private OnClickListener mAdvertiseResourceHandler = new OnClickListener() {
386
387         @Override
388         public void onClick(View v) {
389
390             DLog.v(TAG, "AdvertiseResource click");
391             RM.RMAdvertiseResource(mNotification_ed.getText().toString(),
392                     selectedNetwork);
393         }
394     };
395
396     private OnClickListener mSendRequestHandler = new OnClickListener() {
397
398         @Override
399         public void onClick(View v) {
400
401             DLog.v(TAG, "SendRequest click");
402             RM.RMSendRequest(mReqData_ed.getText().toString(), mPayload_ed
403                     .getText().toString(), selectedNetwork, isSecured, msgType);
404         }
405     };
406
407     private OnClickListener mSendRequestSettingHandler = new OnClickListener() {
408
409         @Override
410         public void onClick(View v) {
411
412             checkMsgSecured("Select DTLS Type");
413             checkMsgType("Select Msg Type");
414         }
415     };
416
417     private OnClickListener mSendResponseNotiSettingHandler = new OnClickListener() {
418
419         @Override
420         public void onClick(View v) {
421
422             checkMsgSecured("Select DTLS Type");
423         }
424     };
425
426     private OnClickListener mResponseHandler = new OnClickListener() {
427
428         @Override
429         public void onClick(View v) {
430
431             RM.RMHandleRequestResponse();
432         }
433     };
434
435     private void showAlertDialog(String title) {
436
437         AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
438         builder.setTitle(title)
439                 .setMultiChoiceItems(mCheckBoxItems, null,
440                         new DialogInterface.OnMultiChoiceClickListener() {
441
442                             @Override
443                             public void onClick(DialogInterface dialog,
444                                     int which, boolean isChecked) {
445
446                                 if (isChecked) {
447
448                                     mSelectedItems.add(which);
449
450                                 } else if (mSelectedItems.contains(which)) {
451
452                                     mSelectedItems.remove(Integer
453                                             .valueOf(which));
454                                 }
455                             }
456                         })
457                 .setPositiveButton("OK", new DialogInterface.OnClickListener() {
458
459                     @Override
460                     public void onClick(DialogInterface dialog, int which) {
461
462                         int interestedNetwork = 0;
463
464                         for (int i = 0; i < mSelectedItems.size(); i++) {
465
466                             if (mSelectedItems.get(i) == Network.WIFI.ordinal()) {
467                                 interestedNetwork |= CA_WIFI;
468                             } else if (mSelectedItems.get(i) == Network.EDR
469                                     .ordinal()) {
470                                 interestedNetwork |= CA_EDR;
471                             } else if (mSelectedItems.get(i) == Network.LE
472                                     .ordinal()) {
473                                 interestedNetwork |= CA_LE;
474                             }
475                         }
476
477                         RM.RMSelectNetwork(interestedNetwork);
478                         selectedNetwork = interestedNetwork;
479                     }
480                 }).show();
481
482         mSelectedItems.clear();
483     }
484
485     private void checkMsgSecured(String title) {
486
487         AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
488
489         builder.setTitle(title)
490                 .setSingleChoiceItems(mDTLSCheckBoxItems, -1,
491                         new DialogInterface.OnClickListener() {
492
493                             @Override
494                             public void onClick(DialogInterface dialog,
495                                     int which) {
496                                 selectedItem = which;
497                             }
498                         })
499                 .setPositiveButton("OK", new DialogInterface.OnClickListener() {
500
501                     @Override
502                     public void onClick(DialogInterface dialog, int which) {
503
504                         if (selectedItem == DTLS.SECURED.ordinal()) {
505                             isSecured = 1;
506                             DLog.v(TAG, "Send secured message");
507
508                             mPayLoadClientEditLayout
509                                     .setVisibility(View.INVISIBLE);
510
511                             mPayLoadServerEditLayout
512                                     .setVisibility(View.INVISIBLE);
513
514                         } else if (selectedItem == DTLS.UNSECURED.ordinal()) {
515                             isSecured = 0;
516                             DLog.v(TAG, "Send unsecured message");
517
518                             if (mCurrentMode == Mode.SERVER) {
519                                 mPayLoadServerEditLayout
520                                         .setVisibility(View.VISIBLE);
521                             } else if (mCurrentMode == Mode.CLIENT) {
522                                 mPayLoadClientEditLayout
523                                         .setVisibility(View.VISIBLE);
524                             }
525                         }
526                     }
527
528                 }).show();
529     }
530
531     private void checkMsgType(String title) {
532
533         AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
534         builder.setTitle(title)
535                 .setSingleChoiceItems(mMsgTyleCheckBoxItems, -1,
536                         new DialogInterface.OnClickListener() {
537
538                             @Override
539                             public void onClick(DialogInterface dialog,
540                                     int which) {
541                                 selectedItem = which;
542                             }
543                         })
544                 .setPositiveButton("OK", new DialogInterface.OnClickListener() {
545
546                     @Override
547                     public void onClick(DialogInterface dialog, int which) {
548
549                         if (selectedItem == MsgType.CON.ordinal()) {
550                             msgType = 0;
551                             DLog.v(TAG, "Message Type is CON");
552
553                         } else if (selectedItem == MsgType.NON.ordinal()) {
554                             msgType = 1;
555                             DLog.v(TAG, "Message Type is NON");
556                         }
557
558                     }
559                 }).show();
560     }
561
562     public void OnResponseReceived(String subject, String receivedData) {
563         String callbackData = subject + receivedData;
564         DLog.v(TAG, callbackData);
565
566     }
567 }