From 9022f2f9cf0d1f99abb33e2393f78897c3cdbefa Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Sun, 22 Mar 2015 10:22:44 +0000 Subject: Misc (re #1782): Coding style works (indentation, etc) on Android pjsua2 sample app codes. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5017 74dad513-b988-da41-8d7b-12977e46ad98 --- .../src/org/pjsip/pjsua2/app/CallActivity.java | 299 +++---- .../src/org/pjsip/pjsua2/app/MainActivity.java | 936 +++++++++++---------- .../android/src/org/pjsip/pjsua2/app/MyApp.java | 869 ++++++++++--------- 3 files changed, 1110 insertions(+), 994 deletions(-) (limited to 'pjsip-apps/src') diff --git a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java index ff81b026..b74b3cd5 100644 --- a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java +++ b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java @@ -31,166 +31,179 @@ import android.app.Activity; import org.pjsip.pjsua2.*; public class CallActivity extends Activity - implements Handler.Callback, SurfaceHolder.Callback + implements Handler.Callback, SurfaceHolder.Callback { - - public static Handler handler_; - - private final Handler handler = new Handler(this); - private static CallInfo lastCallInfo; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_call); - - SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceIncomingVideo); - if (MainActivity.currentCall == null || - MainActivity.currentCall.vidWin == null) - { - surfaceView.setVisibility(View.GONE); - } - surfaceView.getHolder().addCallback(this); - - handler_ = handler; - if (MainActivity.currentCall != null) { - try { - lastCallInfo = MainActivity.currentCall.getInfo(); - updateCallState(lastCallInfo); - } catch (Exception e) { - System.out.println(e); - } - } else { - updateCallState(lastCallInfo); - } + + public static Handler handler_; + + private final Handler handler = new Handler(this); + private static CallInfo lastCallInfo; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_call); + + SurfaceView surfaceView = (SurfaceView) + findViewById(R.id.surfaceIncomingVideo); + if (MainActivity.currentCall == null || + MainActivity.currentCall.vidWin == null) + { + surfaceView.setVisibility(View.GONE); + } + surfaceView.getHolder().addCallback(this); + + handler_ = handler; + if (MainActivity.currentCall != null) { + try { + lastCallInfo = MainActivity.currentCall.getInfo(); + updateCallState(lastCallInfo); + } catch (Exception e) { + System.out.println(e); + } + } else { + updateCallState(lastCallInfo); } + } @Override - protected void onDestroy() { - super.onDestroy(); - handler_ = null; + protected void onDestroy() + { + super.onDestroy(); + handler_ = null; } - private void updateVideoWindow(SurfaceHolder holder) { - if (MainActivity.currentCall != null && - MainActivity.currentCall.vidWin != null) - { - VideoWindowHandle vidWH = new VideoWindowHandle(); - if (holder == null) - vidWH.getHandle().setWindow(null); - else - vidWH.getHandle().setWindow(holder.getSurface()); - try { - MainActivity.currentCall.vidWin.setWindow(vidWH); - } catch (Exception e) {} - } + private void updateVideoWindow(SurfaceHolder holder) + { + if (MainActivity.currentCall != null && + MainActivity.currentCall.vidWin != null) + { + VideoWindowHandle vidWH = new VideoWindowHandle(); + if (holder == null) + vidWH.getHandle().setWindow(null); + else + vidWH.getHandle().setWindow(holder.getSurface()); + try { + MainActivity.currentCall.vidWin.setWindow(vidWH); + } catch (Exception e) {} + } + } + + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) + { + updateVideoWindow(holder); } - - public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - updateVideoWindow(holder); + + public void surfaceCreated(SurfaceHolder holder) + { } - public void surfaceCreated(SurfaceHolder holder) { + public void surfaceDestroyed(SurfaceHolder holder) + { + updateVideoWindow(null); } - public void surfaceDestroyed(SurfaceHolder holder) { - updateVideoWindow(null); + public void acceptCall(View view) + { + CallOpParam prm = new CallOpParam(); + prm.setStatusCode(pjsip_status_code.PJSIP_SC_OK); + try { + MainActivity.currentCall.answer(prm); + } catch (Exception e) { + System.out.println(e); + } + + view.setVisibility(View.GONE); } - - public void acceptCall(View view) { - CallOpParam prm = new CallOpParam(); - prm.setStatusCode(pjsip_status_code.PJSIP_SC_OK); - try { - MainActivity.currentCall.answer(prm); - } catch (Exception e) { - System.out.println(e); - } - - view.setVisibility(View.GONE); + + public void hangupCall(View view) + { + handler_ = null; + finish(); + + if (MainActivity.currentCall != null) { + CallOpParam prm = new CallOpParam(); + prm.setStatusCode(pjsip_status_code.PJSIP_SC_DECLINE); + try { + MainActivity.currentCall.hangup(prm); + } catch (Exception e) { + System.out.println(e); + } } + } + + private void setupVideoSurface() + { + SurfaceView surfaceView = (SurfaceView) + findViewById(R.id.surfaceIncomingVideo); + surfaceView.setVisibility(View.VISIBLE); + updateVideoWindow(surfaceView.getHolder()); + } + + @Override + public boolean handleMessage(Message m) + { + if (m.what == MainActivity.MSG_TYPE.CALL_STATE) { + + lastCallInfo = (CallInfo) m.obj; + updateCallState(lastCallInfo); + + } else if (m.what == MainActivity.MSG_TYPE.CALL_MEDIA_STATE) { + + if (MainActivity.currentCall.vidWin != null) { + /* If there's incoming video, display it. */ + setupVideoSurface(); + } + + } else { + + /* Message not handled */ + return false; - public void hangupCall(View view) { - handler_ = null; - finish(); - - if (MainActivity.currentCall != null) { - CallOpParam prm = new CallOpParam(); - prm.setStatusCode(pjsip_status_code.PJSIP_SC_DECLINE); - try { - MainActivity.currentCall.hangup(prm); - } catch (Exception e) { - System.out.println(e); - } - } } - - private void setupVideoSurface() { - SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceIncomingVideo); - surfaceView.setVisibility(View.VISIBLE); - updateVideoWindow(surfaceView.getHolder()); - + return true; + } + + private void updateCallState(CallInfo ci) { + TextView tvPeer = (TextView) findViewById(R.id.textViewPeer); + TextView tvState = (TextView) findViewById(R.id.textViewCallState); + Button buttonHangup = (Button) findViewById(R.id.buttonHangup); + Button buttonAccept = (Button) findViewById(R.id.buttonAccept); + String call_state = ""; + + if (ci.getRole() == pjsip_role_e.PJSIP_ROLE_UAC) { + buttonAccept.setVisibility(View.GONE); } - - @Override - public boolean handleMessage(Message m) { - - if (m.what == MainActivity.MSG_TYPE.CALL_STATE) { - - lastCallInfo = (CallInfo) m.obj; - updateCallState(lastCallInfo); - - } else if (m.what == MainActivity.MSG_TYPE.CALL_MEDIA_STATE) { - - if (MainActivity.currentCall.vidWin != null) { - /* If there's incoming video, display it. */ - setupVideoSurface(); - } - - } else { - - /* Message not handled */ - return false; - - } - - return true; + + if (ci.getState().swigValue() < + pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED.swigValue()) + { + if (ci.getRole() == pjsip_role_e.PJSIP_ROLE_UAS) { + call_state = "Incoming call.."; + /* Default button texts are already 'Accept' & 'Reject' */ + } else { + buttonHangup.setText("Cancel"); + call_state = ci.getStateText(); + } } - - private void updateCallState(CallInfo ci) { - TextView tvPeer = (TextView) findViewById(R.id.textViewPeer); - TextView tvState = (TextView) findViewById(R.id.textViewCallState); - Button buttonHangup = (Button) findViewById(R.id.buttonHangup); - Button buttonAccept = (Button) findViewById(R.id.buttonAccept); - String call_state = ""; - - if (ci.getRole() == pjsip_role_e.PJSIP_ROLE_UAC) { - buttonAccept.setVisibility(View.GONE); - } - - if (ci.getState().swigValue() < pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED.swigValue()) - { - if (ci.getRole() == pjsip_role_e.PJSIP_ROLE_UAS) { - call_state = "Incoming call.."; - /* Default button texts are already 'Accept' & 'Reject' */ - } else { - buttonHangup.setText("Cancel"); - call_state = ci.getStateText(); - } - } - else if (ci.getState().swigValue() >= pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED.swigValue()) - { - buttonAccept.setVisibility(View.GONE); - call_state = ci.getStateText(); - if (ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED) { - buttonHangup.setText("Hangup"); - } else if (ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) { - buttonHangup.setText("OK"); - call_state = "Call disconnected: " + ci.getLastReason(); - } - } - - tvPeer.setText(ci.getRemoteUri()); - tvState.setText(call_state); + else if (ci.getState().swigValue() >= + pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED.swigValue()) + { + buttonAccept.setVisibility(View.GONE); + call_state = ci.getStateText(); + if (ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED) { + buttonHangup.setText("Hangup"); + } else if (ci.getState() == + pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) + { + buttonHangup.setText("OK"); + call_state = "Call disconnected: " + ci.getLastReason(); + } } + + tvPeer.setText(ci.getRemoteUri()); + tvState.setText(call_state); + } } diff --git a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MainActivity.java b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MainActivity.java index e0d87c04..990e0c23 100644 --- a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MainActivity.java +++ b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MainActivity.java @@ -43,481 +43,537 @@ import java.util.Map; import org.pjsip.pjsua2.*; -public class MainActivity extends Activity implements Handler.Callback, MyAppObserver { - public static MyApp app = null; - public static MyCall currentCall = null; - public static MyAccount account = null; - public static AccountConfig accCfg = null; - - private ListView buddyListView; - private SimpleAdapter buddyListAdapter; - private int buddyListSelectedIdx = -1; +public class MainActivity extends Activity + implements Handler.Callback, MyAppObserver +{ + public static MyApp app = null; + public static MyCall currentCall = null; + public static MyAccount account = null; + public static AccountConfig accCfg = null; + + private ListView buddyListView; + private SimpleAdapter buddyListAdapter; + private int buddyListSelectedIdx = -1; ArrayList> buddyList; private String lastRegStatus = ""; - private final Handler handler = new Handler(this); - public class MSG_TYPE { - public final static int INCOMING_CALL = 1; - public final static int CALL_STATE = 2; - public final static int REG_STATE = 3; - public final static int BUDDY_STATE = 4; - public final static int CALL_MEDIA_STATE = 5; + private final Handler handler = new Handler(this); + public class MSG_TYPE + { + public final static int INCOMING_CALL = 1; + public final static int CALL_STATE = 2; + public final static int REG_STATE = 3; + public final static int BUDDY_STATE = 4; + public final static int CALL_MEDIA_STATE = 5; + } + + private HashMap putData(String uri, String status) + { + HashMap item = new HashMap(); + item.put("uri", uri); + item.put("status", status); + return item; + } + + private void showCallActivity() + { + Intent intent = new Intent(this, CallActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + if (app == null) { + app = new MyApp(); + // Wait for GDB to init, for native debugging only + if (false && + (getApplicationInfo().flags & + ApplicationInfo.FLAG_DEBUGGABLE) != 0) + { + try { + Thread.sleep(5000); + } catch (InterruptedException e) {} + } + + app.init(this, getFilesDir().getAbsolutePath()); } - private HashMap putData(String uri, String status) { - HashMap item = new HashMap(); - item.put("uri", uri); - item.put("status", status); - return item; + if (app.accList.size() == 0) { + accCfg = new AccountConfig(); + accCfg.setIdUri("sip:localhost"); + accCfg.getNatConfig().setIceEnabled(true); + account = app.addAcc(accCfg); + } else { + account = app.accList.get(0); + accCfg = account.cfg; } - - private void showCallActivity() { - Intent intent = new Intent(this, CallActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); + + buddyList = new ArrayList>(); + for (int i = 0; i < account.buddyList.size(); i++) { + buddyList.add(putData(account.buddyList.get(i).cfg.getUri(), + account.buddyList.get(i).getStatusText())); } - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - if (app == null) { - app = new MyApp(); - /* Wait for GDB to init */ - if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { - try { - Thread.sleep(5000); - } catch (InterruptedException e) {} - } - - app.init(this, getFilesDir().getAbsolutePath()); + String[] from = { "uri", "status" }; + int[] to = { android.R.id.text1, android.R.id.text2 }; + buddyListAdapter = new SimpleAdapter( + this, buddyList, + android.R.layout.simple_list_item_2, + from, to); + + buddyListView = (ListView) findViewById(R.id.listViewBuddy);; + buddyListView.setAdapter(buddyListAdapter); + buddyListView.setOnItemClickListener( + new AdapterView.OnItemClickListener() + { + @Override + public void onItemClick(AdapterView parent, + final View view, + int position, long id) + { + view.setSelected(true); + buddyListSelectedIdx = position; } - - if (app.accList.size() == 0) { - accCfg = new AccountConfig(); - accCfg.setIdUri("sip:localhost"); - accCfg.getNatConfig().setIceEnabled(true); - account = app.addAcc(accCfg); - } else { - account = app.accList.get(0); - accCfg = account.cfg; } - - buddyList = new ArrayList>(); - for (int i = 0; i < account.buddyList.size(); i++) { - buddyList.add(putData(account.buddyList.get(i).cfg.getUri(), - account.buddyList.get(i).getStatusText())); - } + ); + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + // Inflate the menu; this adds items to the action bar + // if it is present. + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + switch (item.getItemId()) { + case R.id.action_acc_config: + dlgAccountSetting(); + break; + + case R.id.action_quit: + Message m = Message.obtain(handler, 0); + m.sendToTarget(); + break; - String[] from = { "uri", "status" }; - int[] to = { android.R.id.text1, android.R.id.text2 }; - buddyListAdapter = new SimpleAdapter(this, buddyList, android.R.layout.simple_list_item_2, from, to); - - buddyListView = (ListView) findViewById(R.id.listViewBuddy);; - buddyListView.setAdapter(buddyListAdapter); - buddyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, final View view, - int position, long id) - { - view.setSelected(true); - buddyListSelectedIdx = position; - } - }); - + default: + break; } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.main, menu); - return true; - } + return true; + } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_acc_config: - dlgAccountSetting(); - break; + @Override + public boolean handleMessage(Message m) + { + if (m.what == 0) { - case R.id.action_quit: - Message m = Message.obtain(handler, 0); - m.sendToTarget(); - break; - - default: - break; - } + app.deinit(); + finish(); + Runtime.getRuntime().gc(); + android.os.Process.killProcess(android.os.Process.myPid()); - return true; - } - - @Override - public boolean handleMessage(Message m) { - - if (m.what == 0) { - - app.deinit(); - finish(); - Runtime.getRuntime().gc(); - android.os.Process.killProcess(android.os.Process.myPid()); - - } else if (m.what == MSG_TYPE.CALL_STATE) { - - CallInfo ci = (CallInfo) m.obj; - - /* Forward the message to CallActivity */ - if (CallActivity.handler_ != null) { - Message m2 = Message.obtain(CallActivity.handler_, MSG_TYPE.CALL_STATE, ci); - m2.sendToTarget(); - } - - } else if (m.what == MSG_TYPE.CALL_MEDIA_STATE) { - - /* Forward the message to CallActivity */ - if (CallActivity.handler_ != null) { - Message m2 = Message.obtain(CallActivity.handler_, MSG_TYPE.CALL_MEDIA_STATE, null); - m2.sendToTarget(); - } - - } else if (m.what == MSG_TYPE.BUDDY_STATE) { - - MyBuddy buddy = (MyBuddy) m.obj; - int idx = account.buddyList.indexOf(buddy); - - /* Update buddy status text, if buddy is valid and - * the buddy lists in account and UI are sync-ed. - */ - if (idx >= 0 && account.buddyList.size() == buddyList.size()) { - buddyList.get(idx).put("status", buddy.getStatusText()); - buddyListAdapter.notifyDataSetChanged(); - // TODO: selection color/mark is gone after this, - // dont know how to return it back. - //buddyListView.setSelection(buddyListSelectedIdx); - //buddyListView.performItemClick(buddyListView, buddyListSelectedIdx, - // buddyListView.getItemIdAtPosition(buddyListSelectedIdx)); - - /* Return back Call activity */ - notifyCallState(currentCall); - } - - } else if (m.what == MSG_TYPE.REG_STATE) { - - String msg_str = (String) m.obj; - lastRegStatus = msg_str; - - } else if (m.what == MSG_TYPE.INCOMING_CALL) { - - /* Incoming call */ - final MyCall call = (MyCall) m.obj; - CallOpParam prm = new CallOpParam(); - - /* Only one call at anytime */ - if (currentCall != null) { - /* - prm.setStatusCode(pjsip_status_code.PJSIP_SC_BUSY_HERE); - try { - call.hangup(prm); - } catch (Exception e) {} - */ - // TODO: set status code - call.delete(); - return true; - } + } else if (m.what == MSG_TYPE.CALL_STATE) { - /* Answer with ringing */ - prm.setStatusCode(pjsip_status_code.PJSIP_SC_RINGING); - try { - call.answer(prm); - } catch (Exception e) {} - - currentCall = call; - showCallActivity(); - - } else { - - /* Message not handled */ - return false; - - } - - return true; - } - - - private void dlgAccountSetting() { - - LayoutInflater li = LayoutInflater.from(this); - View view = li.inflate(R.layout.dlg_account_config, null); - - if (lastRegStatus.length()!=0) { - TextView tvInfo = (TextView)view.findViewById(R.id.textViewInfo); - tvInfo.setText("Last status: " + lastRegStatus); - } + CallInfo ci = (CallInfo) m.obj; - AlertDialog.Builder adb = new AlertDialog.Builder(this); - adb.setView(view); - adb.setTitle("Account Settings"); - - final EditText etId = (EditText)view.findViewById(R.id.editTextId); - final EditText etReg = (EditText)view.findViewById(R.id.editTextRegistrar); - final EditText etProxy = (EditText)view.findViewById(R.id.editTextProxy); - final EditText etUser = (EditText)view.findViewById(R.id.editTextUsername); - final EditText etPass = (EditText)view.findViewById(R.id.editTextPassword); - - etId. setText(accCfg.getIdUri()); - etReg. setText(accCfg.getRegConfig().getRegistrarUri()); - StringVector proxies = accCfg.getSipConfig().getProxies(); - if (proxies.size() > 0) - etProxy.setText(proxies.get(0)); - else - etProxy.setText(""); - AuthCredInfoVector creds = accCfg.getSipConfig().getAuthCreds(); - if (creds.size() > 0) { - etUser. setText(creds.get(0).getUsername()); - etPass. setText(creds.get(0).getData()); - } else { - etUser. setText(""); - etPass. setText(""); - } - - adb.setCancelable(false); - adb.setPositiveButton("OK", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - String acc_id = etId.getText().toString(); - String registrar = etReg.getText().toString(); - String proxy = etProxy.getText().toString(); - String username = etUser.getText().toString(); - String password = etPass.getText().toString(); - - accCfg.setIdUri(acc_id); - accCfg.getRegConfig().setRegistrarUri(registrar); - AuthCredInfoVector creds = accCfg.getSipConfig().getAuthCreds(); - creds.clear(); - if (username.length() != 0) { - creds.add(new AuthCredInfo("Digest", "*", username, 0, password)); - } - StringVector proxies = accCfg.getSipConfig().getProxies(); - proxies.clear(); - if (proxy.length() != 0) { - proxies.add(proxy); - } - - /* Enable ICE */ - accCfg.getNatConfig().setIceEnabled(true); - - /* Finally */ - lastRegStatus = ""; - try { - account.modify(accCfg); - } catch (Exception e) {} - } - }); - adb.setNegativeButton("Cancel", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - dialog.cancel(); - } - }); - - AlertDialog ad = adb.create(); - ad.show(); - } - - - public void makeCall(View view) { - if (buddyListSelectedIdx == -1) - return; - - /* Only one call at anytime */ - if (currentCall != null) { - return; - } - - HashMap item = (HashMap) buddyListView.getItemAtPosition(buddyListSelectedIdx); - String buddy_uri = item.get("uri"); - - MyCall call = new MyCall(account, -1); - CallOpParam prm = new CallOpParam(true); + /* Forward the message to CallActivity */ + if (CallActivity.handler_ != null) { + Message m2 = Message.obtain(CallActivity.handler_, + MSG_TYPE.CALL_STATE, ci); + m2.sendToTarget(); + } + + } else if (m.what == MSG_TYPE.CALL_MEDIA_STATE) { + + /* Forward the message to CallActivity */ + if (CallActivity.handler_ != null) { + Message m2 = Message.obtain(CallActivity.handler_, + MSG_TYPE.CALL_MEDIA_STATE, + null); + m2.sendToTarget(); + } + + } else if (m.what == MSG_TYPE.BUDDY_STATE) { + + MyBuddy buddy = (MyBuddy) m.obj; + int idx = account.buddyList.indexOf(buddy); + + /* Update buddy status text, if buddy is valid and + * the buddy lists in account and UI are sync-ed. + */ + if (idx >= 0 && account.buddyList.size() == buddyList.size()) + { + buddyList.get(idx).put("status", buddy.getStatusText()); + buddyListAdapter.notifyDataSetChanged(); + // TODO: selection color/mark is gone after this, + // dont know how to return it back. + //buddyListView.setSelection(buddyListSelectedIdx); + //buddyListView.performItemClick(buddyListView, + // buddyListSelectedIdx, + // buddyListView. + // getItemIdAtPosition(buddyListSelectedIdx)); + + /* Return back Call activity */ + notifyCallState(currentCall); + } + + } else if (m.what == MSG_TYPE.REG_STATE) { + + String msg_str = (String) m.obj; + lastRegStatus = msg_str; + + } else if (m.what == MSG_TYPE.INCOMING_CALL) { + /* Incoming call */ + final MyCall call = (MyCall) m.obj; + CallOpParam prm = new CallOpParam(); + + /* Only one call at anytime */ + if (currentCall != null) { + /* + prm.setStatusCode(pjsip_status_code.PJSIP_SC_BUSY_HERE); try { - call.makeCall(buddy_uri, prm); - } catch (Exception e) { - call.delete(); - return; - } - - currentCall = call; - showCallActivity(); - } + call.hangup(prm); + } catch (Exception e) {} + */ + // TODO: set status code + call.delete(); + return true; + } - private void dlgAddEditBuddy(BuddyConfig initial) { - final BuddyConfig cfg = new BuddyConfig(); - final BuddyConfig old_cfg = initial; - final boolean is_add = initial == null; - - LayoutInflater li = LayoutInflater.from(this); - View view = li.inflate(R.layout.dlg_add_buddy, null); - - AlertDialog.Builder adb = new AlertDialog.Builder(this); - adb.setView(view); - - final EditText etUri = (EditText)view.findViewById(R.id.editTextUri); - final CheckBox cbSubs = (CheckBox)view.findViewById(R.id.checkBoxSubscribe); - - if (is_add) { - adb.setTitle("Add Buddy"); - } else { - adb.setTitle("Edit Buddy"); - etUri. setText(initial.getUri()); - cbSubs.setChecked(initial.getSubscribe()); - } + /* Answer with ringing */ + prm.setStatusCode(pjsip_status_code.PJSIP_SC_RINGING); + try { + call.answer(prm); + } catch (Exception e) {} + + currentCall = call; + showCallActivity(); + + } else { + + /* Message not handled */ + return false; - adb.setCancelable(false); - adb.setPositiveButton("OK", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - cfg.setUri(etUri.getText().toString()); - cfg.setSubscribe(cbSubs.isChecked()); - - if (is_add) { - account.addBuddy(cfg); - buddyList.add(putData(cfg.getUri(), "")); - buddyListAdapter.notifyDataSetChanged(); - buddyListSelectedIdx = -1; - } else { - if (!old_cfg.getUri().equals(cfg.getUri())) { - account.delBuddy(buddyListSelectedIdx); - account.addBuddy(cfg); - buddyList.remove(buddyListSelectedIdx); - buddyList.add(putData(cfg.getUri(), "")); - buddyListAdapter.notifyDataSetChanged(); - buddyListSelectedIdx = -1; - } else if (old_cfg.getSubscribe() != cfg.getSubscribe()) { - MyBuddy bud = account.buddyList.get(buddyListSelectedIdx); - try { - bud.subscribePresence(cfg.getSubscribe()); - } catch (Exception e) {} - } - } - } - }); - adb.setNegativeButton("Cancel", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - dialog.cancel(); - } - }); - - AlertDialog ad = adb.create(); - ad.show(); } - - public void addBuddy(View view) { - dlgAddEditBuddy(null); + + return true; + } + + + private void dlgAccountSetting() + { + LayoutInflater li = LayoutInflater.from(this); + View view = li.inflate(R.layout.dlg_account_config, null); + + if (lastRegStatus.length()!=0) { + TextView tvInfo = (TextView)view.findViewById(R.id.textViewInfo); + tvInfo.setText("Last status: " + lastRegStatus); } - public void editBuddy(View view) { - if (buddyListSelectedIdx == -1) - return; - - BuddyConfig old_cfg = account.buddyList.get(buddyListSelectedIdx).cfg; - dlgAddEditBuddy(old_cfg); + AlertDialog.Builder adb = new AlertDialog.Builder(this); + adb.setView(view); + adb.setTitle("Account Settings"); + + final EditText etId = (EditText)view.findViewById(R.id.editTextId); + final EditText etReg = (EditText)view.findViewById(R.id.editTextRegistrar); + final EditText etProxy = (EditText)view.findViewById(R.id.editTextProxy); + final EditText etUser = (EditText)view.findViewById(R.id.editTextUsername); + final EditText etPass = (EditText)view.findViewById(R.id.editTextPassword); + + etId. setText(accCfg.getIdUri()); + etReg. setText(accCfg.getRegConfig().getRegistrarUri()); + StringVector proxies = accCfg.getSipConfig().getProxies(); + if (proxies.size() > 0) + etProxy.setText(proxies.get(0)); + else + etProxy.setText(""); + AuthCredInfoVector creds = accCfg.getSipConfig().getAuthCreds(); + if (creds.size() > 0) { + etUser. setText(creds.get(0).getUsername()); + etPass. setText(creds.get(0).getData()); + } else { + etUser. setText(""); + etPass. setText(""); } - - public void delBuddy(View view) { - if (buddyListSelectedIdx == -1) - return; - - final HashMap item = (HashMap) buddyListView.getItemAtPosition(buddyListSelectedIdx); - String buddy_uri = item.get("uri"); - - DialogInterface.OnClickListener ocl = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - account.delBuddy(buddyListSelectedIdx); - buddyList.remove(item); - buddyListAdapter.notifyDataSetChanged(); - buddyListSelectedIdx = -1; - break; - case DialogInterface.BUTTON_NEGATIVE: - break; - } + + adb.setCancelable(false); + adb.setPositiveButton("OK", + new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + String acc_id = etId.getText().toString(); + String registrar = etReg.getText().toString(); + String proxy = etProxy.getText().toString(); + String username = etUser.getText().toString(); + String password = etPass.getText().toString(); + + accCfg.setIdUri(acc_id); + accCfg.getRegConfig().setRegistrarUri(registrar); + AuthCredInfoVector creds = accCfg.getSipConfig(). + getAuthCreds(); + creds.clear(); + if (username.length() != 0) { + creds.add(new AuthCredInfo("Digest", "*", username, 0, + password)); + } + StringVector proxies = accCfg.getSipConfig().getProxies(); + proxies.clear(); + if (proxy.length() != 0) { + proxies.add(proxy); } - }; - - AlertDialog.Builder adb = new AlertDialog.Builder(this); - adb.setTitle(buddy_uri); - adb.setMessage("\nDelete this buddy?\n"); - adb.setPositiveButton("Yes", ocl); - adb.setNegativeButton("No", ocl); - adb.show(); + + /* Enable ICE */ + accCfg.getNatConfig().setIceEnabled(true); + + /* Finally */ + lastRegStatus = ""; + try { + account.modify(accCfg); + } catch (Exception e) {} + } + } + ); + adb.setNegativeButton("Cancel", + new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + dialog.cancel(); + } + } + ); + + AlertDialog ad = adb.create(); + ad.show(); + } + + + public void makeCall(View view) + { + if (buddyListSelectedIdx == -1) + return; + + /* Only one call at anytime */ + if (currentCall != null) { + return; } - - - /* - * === MyAppObserver === - * - * As we cannot do UI from worker thread, the callbacks mostly just send - * a message to UI/main thread. - */ - - public void notifyIncomingCall(MyCall call) { - Message m = Message.obtain(handler, MSG_TYPE.INCOMING_CALL, call); - m.sendToTarget(); + + HashMap item = (HashMap) buddyListView. + getItemAtPosition(buddyListSelectedIdx); + String buddy_uri = item.get("uri"); + + MyCall call = new MyCall(account, -1); + CallOpParam prm = new CallOpParam(true); + + try { + call.makeCall(buddy_uri, prm); + } catch (Exception e) { + call.delete(); + return; } - public void notifyRegState(pjsip_status_code code, String reason, int expiration) { - String msg_str = ""; - if (expiration == 0) - msg_str += "Unregistration"; - else - msg_str += "Registration"; - - if (code.swigValue()/100 == 2) - msg_str += " successful"; - else - msg_str += " failed: " + reason; - - Message m = Message.obtain(handler, MSG_TYPE.REG_STATE, msg_str); - m.sendToTarget(); + currentCall = call; + showCallActivity(); + } + + private void dlgAddEditBuddy(BuddyConfig initial) + { + final BuddyConfig cfg = new BuddyConfig(); + final BuddyConfig old_cfg = initial; + final boolean is_add = initial == null; + + LayoutInflater li = LayoutInflater.from(this); + View view = li.inflate(R.layout.dlg_add_buddy, null); + + AlertDialog.Builder adb = new AlertDialog.Builder(this); + adb.setView(view); + + final EditText etUri = (EditText)view.findViewById(R.id.editTextUri); + final CheckBox cbSubs = (CheckBox)view.findViewById(R.id.checkBoxSubscribe); + + if (is_add) { + adb.setTitle("Add Buddy"); + } else { + adb.setTitle("Edit Buddy"); + etUri. setText(initial.getUri()); + cbSubs.setChecked(initial.getSubscribe()); } - - public void notifyCallState(MyCall call) { - if (currentCall == null || call.getId() != currentCall.getId()) - return; - - CallInfo ci; - try { - ci = call.getInfo(); - } catch (Exception e) { - ci = null; - } - Message m = Message.obtain(handler, MSG_TYPE.CALL_STATE, ci); - m.sendToTarget(); - - if (ci != null && - ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) + + adb.setCancelable(false); + adb.setPositiveButton("OK", + new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) { - currentCall = null; + cfg.setUri(etUri.getText().toString()); + cfg.setSubscribe(cbSubs.isChecked()); + + if (is_add) { + account.addBuddy(cfg); + buddyList.add(putData(cfg.getUri(), "")); + buddyListAdapter.notifyDataSetChanged(); + buddyListSelectedIdx = -1; + } else { + if (!old_cfg.getUri().equals(cfg.getUri())) { + account.delBuddy(buddyListSelectedIdx); + account.addBuddy(cfg); + buddyList.remove(buddyListSelectedIdx); + buddyList.add(putData(cfg.getUri(), "")); + buddyListAdapter.notifyDataSetChanged(); + buddyListSelectedIdx = -1; + } else if (old_cfg.getSubscribe() != + cfg.getSubscribe()) + { + MyBuddy bud = account.buddyList.get( + buddyListSelectedIdx); + try { + bud.subscribePresence(cfg.getSubscribe()); + } catch (Exception e) {} + } + } } + } + ); + adb.setNegativeButton("Cancel", + new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) { + dialog.cancel(); + } + } + ); + + AlertDialog ad = adb.create(); + ad.show(); + } + + public void addBuddy(View view) + { + dlgAddEditBuddy(null); + } + + public void editBuddy(View view) + { + if (buddyListSelectedIdx == -1) + return; + + BuddyConfig old_cfg = account.buddyList.get(buddyListSelectedIdx).cfg; + dlgAddEditBuddy(old_cfg); + } + + public void delBuddy(View view) { + if (buddyListSelectedIdx == -1) + return; + + final HashMap item = (HashMap) + buddyListView.getItemAtPosition(buddyListSelectedIdx); + String buddy_uri = item.get("uri"); + + DialogInterface.OnClickListener ocl = + new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + account.delBuddy(buddyListSelectedIdx); + buddyList.remove(item); + buddyListAdapter.notifyDataSetChanged(); + buddyListSelectedIdx = -1; + break; + case DialogInterface.BUTTON_NEGATIVE: + break; + } + } + }; + + AlertDialog.Builder adb = new AlertDialog.Builder(this); + adb.setTitle(buddy_uri); + adb.setMessage("\nDelete this buddy?\n"); + adb.setPositiveButton("Yes", ocl); + adb.setNegativeButton("No", ocl); + adb.show(); + } + + + /* + * === MyAppObserver === + * + * As we cannot do UI from worker thread, the callbacks mostly just send + * a message to UI/main thread. + */ + + public void notifyIncomingCall(MyCall call) + { + Message m = Message.obtain(handler, MSG_TYPE.INCOMING_CALL, call); + m.sendToTarget(); + } + + public void notifyRegState(pjsip_status_code code, String reason, + int expiration) + { + String msg_str = ""; + if (expiration == 0) + msg_str += "Unregistration"; + else + msg_str += "Registration"; + + if (code.swigValue()/100 == 2) + msg_str += " successful"; + else + msg_str += " failed: " + reason; + + Message m = Message.obtain(handler, MSG_TYPE.REG_STATE, msg_str); + m.sendToTarget(); + } + + public void notifyCallState(MyCall call) + { + if (currentCall == null || call.getId() != currentCall.getId()) + return; + + CallInfo ci; + try { + ci = call.getInfo(); + } catch (Exception e) { + ci = null; } - - public void notifyCallMediaState(MyCall call) { - Message m = Message.obtain(handler, MSG_TYPE.CALL_MEDIA_STATE, null); - m.sendToTarget(); - } - - public void notifyBuddyState(MyBuddy buddy) { - Message m = Message.obtain(handler, MSG_TYPE.BUDDY_STATE, buddy); - m.sendToTarget(); + Message m = Message.obtain(handler, MSG_TYPE.CALL_STATE, ci); + m.sendToTarget(); + + if (ci != null && + ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) + { + currentCall = null; } + } + + public void notifyCallMediaState(MyCall call) + { + Message m = Message.obtain(handler, MSG_TYPE.CALL_MEDIA_STATE, null); + m.sendToTarget(); + } + + public void notifyBuddyState(MyBuddy buddy) + { + Message m = Message.obtain(handler, MSG_TYPE.BUDDY_STATE, buddy); + m.sendToTarget(); + } - /* === end of MyAppObserver ==== */ + /* === end of MyAppObserver ==== */ } diff --git a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java index 9b3e3baa..36dbc1dd 100644 --- a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java +++ b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java @@ -25,460 +25,507 @@ import org.pjsip.pjsua2.*; /* Interface to separate UI & engine a bit better */ -interface MyAppObserver { - abstract void notifyRegState(pjsip_status_code code, String reason, int expiration); - abstract void notifyIncomingCall(MyCall call); - abstract void notifyCallState(MyCall call); - abstract void notifyCallMediaState(MyCall call); - abstract void notifyBuddyState(MyBuddy buddy); +interface MyAppObserver +{ + abstract void notifyRegState(pjsip_status_code code, String reason, + int expiration); + abstract void notifyIncomingCall(MyCall call); + abstract void notifyCallState(MyCall call); + abstract void notifyCallMediaState(MyCall call); + abstract void notifyBuddyState(MyBuddy buddy); } -class MyLogWriter extends LogWriter { - @Override - public void write(LogEntry entry) { - System.out.println(entry.getMsg()); - } +class MyLogWriter extends LogWriter +{ + @Override + public void write(LogEntry entry) + { + System.out.println(entry.getMsg()); + } } -class MyCall extends Call { - public VideoWindow vidWin; - - MyCall(MyAccount acc, int call_id) { - super(acc, call_id); - vidWin = null; - } +class MyCall extends Call +{ + public VideoWindow vidWin; - @Override - public void onCallState(OnCallStateParam prm) { - MyApp.observer.notifyCallState(this); - try { - CallInfo ci = getInfo(); - if (ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) { - this.delete(); - } - } catch (Exception e) { - return; + MyCall(MyAccount acc, int call_id) + { + super(acc, call_id); + vidWin = null; + } + + @Override + public void onCallState(OnCallStateParam prm) + { + MyApp.observer.notifyCallState(this); + try { + CallInfo ci = getInfo(); + if (ci.getState() == + pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) + { + this.delete(); } + } catch (Exception e) { + return; + } + } + + @Override + public void onCallMediaState(OnCallMediaStateParam prm) + { + CallInfo ci; + try { + ci = getInfo(); + } catch (Exception e) { + return; } - - @Override - public void onCallMediaState(OnCallMediaStateParam prm) { - CallInfo ci; + + CallMediaInfoVector cmiv = ci.getMedia(); + + for (int i = 0; i < cmiv.size(); i++) { + CallMediaInfo cmi = cmiv.get(i); + if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_AUDIO && + (cmi.getStatus() == + pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE || + cmi.getStatus() == + pjsua_call_media_status.PJSUA_CALL_MEDIA_REMOTE_HOLD)) + { + // unfortunately, on Java too, the returned Media cannot be + // downcasted to AudioMedia + Media m = getMedia(i); + AudioMedia am = AudioMedia.typecastFromMedia(m); + + // connect ports try { - ci = getInfo(); + MyApp.ep.audDevManager().getCaptureDevMedia(). + startTransmit(am); + am.startTransmit(MyApp.ep.audDevManager(). + getPlaybackDevMedia()); } catch (Exception e) { - return; + continue; } - - CallMediaInfoVector cmiv = ci.getMedia(); - - for (int i = 0; i < cmiv.size(); i++) { - CallMediaInfo cmi = cmiv.get(i); - if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_AUDIO && - (cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE || - cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_REMOTE_HOLD)) - { - // unfortunately, on Java too, the returned Media cannot be downcasted to AudioMedia - Media m = getMedia(i); - AudioMedia am = AudioMedia.typecastFromMedia(m); - - // connect ports - try { - MyApp.ep.audDevManager().getCaptureDevMedia().startTransmit(am); - am.startTransmit(MyApp.ep.audDevManager().getPlaybackDevMedia()); - } catch (Exception e) { - continue; - } - } else if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_VIDEO && - cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE && - cmi.getVideoIncomingWindowId() != pjsua2.INVALID_ID) - { - vidWin = new VideoWindow(cmi.getVideoIncomingWindowId()); - } - } - - MyApp.observer.notifyCallMediaState(this); + } else if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_VIDEO && + cmi.getStatus() == + pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE && + cmi.getVideoIncomingWindowId() != pjsua2.INVALID_ID) + { + vidWin = new VideoWindow(cmi.getVideoIncomingWindowId()); + } } + + MyApp.observer.notifyCallMediaState(this); + } } -class MyAccount extends Account { - public ArrayList buddyList = new ArrayList(); - public AccountConfig cfg; - - MyAccount(AccountConfig config) { - super(); - cfg = config; +class MyAccount extends Account +{ + public ArrayList buddyList = new ArrayList(); + public AccountConfig cfg; + + MyAccount(AccountConfig config) + { + super(); + cfg = config; + } + + public MyBuddy addBuddy(BuddyConfig bud_cfg) + { + /* Create Buddy */ + MyBuddy bud = new MyBuddy(bud_cfg); + try { + bud.create(this, bud_cfg); + } catch (Exception e) { + bud.delete(); + bud = null; } - - public MyBuddy addBuddy(BuddyConfig bud_cfg) - { - /* Create Buddy */ - MyBuddy bud = new MyBuddy(bud_cfg); + + if (bud != null) { + buddyList.add(bud); + if (bud_cfg.getSubscribe()) try { - bud.create(this, bud_cfg); - } catch (Exception e) { - bud.delete(); - bud = null; - } - - if (bud != null) { - buddyList.add(bud); - if (bud_cfg.getSubscribe()) - try { - bud.subscribePresence(true); - } catch (Exception e) {} - } - - return bud; - } - - public void delBuddy(MyBuddy buddy) { - buddyList.remove(buddy); - buddy.delete(); - } - - public void delBuddy(int index) { - MyBuddy bud = buddyList.get(index); - buddyList.remove(index); - bud.delete(); - } - - @Override - public void onRegState(OnRegStateParam prm) { - MyApp.observer.notifyRegState(prm.getCode(), prm.getReason(), prm.getExpiration()); + bud.subscribePresence(true); + } catch (Exception e) {} } - @Override - public void onIncomingCall(OnIncomingCallParam prm) { - System.out.println("======== Incoming call ======== "); - MyCall call = new MyCall(this, prm.getCallId()); - MyApp.observer.notifyIncomingCall(call); - } - - @Override - public void onInstantMessage(OnInstantMessageParam prm) { - System.out.println("======== Incoming pager ======== "); - System.out.println("From : " + prm.getFromUri()); - System.out.println("To : " + prm.getToUri()); - System.out.println("Contact : " + prm.getContactUri()); - System.out.println("Mimetype : " + prm.getContentType()); - System.out.println("Body : " + prm.getMsgBody()); - } + return bud; + } + + public void delBuddy(MyBuddy buddy) + { + buddyList.remove(buddy); + buddy.delete(); + } + + public void delBuddy(int index) + { + MyBuddy bud = buddyList.get(index); + buddyList.remove(index); + bud.delete(); + } + + @Override + public void onRegState(OnRegStateParam prm) + { + MyApp.observer.notifyRegState(prm.getCode(), prm.getReason(), + prm.getExpiration()); + } + + @Override + public void onIncomingCall(OnIncomingCallParam prm) + { + System.out.println("======== Incoming call ======== "); + MyCall call = new MyCall(this, prm.getCallId()); + MyApp.observer.notifyIncomingCall(call); + } + + @Override + public void onInstantMessage(OnInstantMessageParam prm) + { + System.out.println("======== Incoming pager ======== "); + System.out.println("From : " + prm.getFromUri()); + System.out.println("To : " + prm.getToUri()); + System.out.println("Contact : " + prm.getContactUri()); + System.out.println("Mimetype : " + prm.getContentType()); + System.out.println("Body : " + prm.getMsgBody()); + } } -class MyBuddy extends Buddy { - public BuddyConfig cfg; - - MyBuddy(BuddyConfig config) { - super(); - cfg = config; +class MyBuddy extends Buddy +{ + public BuddyConfig cfg; + + MyBuddy(BuddyConfig config) + { + super(); + cfg = config; + } + + String getStatusText() + { + BuddyInfo bi; + + try { + bi = getInfo(); + } catch (Exception e) { + return "?"; } - - String getStatusText() { - BuddyInfo bi; - - try { - bi = getInfo(); - } catch (Exception e) { - return "?"; - } - - String status = ""; - if (bi.getSubState() == pjsip_evsub_state.PJSIP_EVSUB_STATE_ACTIVE) { - if (bi.getPresStatus().getStatus() == pjsua_buddy_status.PJSUA_BUDDY_STATUS_ONLINE) { - status = bi.getPresStatus().getStatusText(); - if (status == null || status.length()==0) { - status = "Online"; - } - } else if (bi.getPresStatus().getStatus() == pjsua_buddy_status.PJSUA_BUDDY_STATUS_OFFLINE) { - status = "Offline"; - } else { - status = "Unknown"; - } + + String status = ""; + if (bi.getSubState() == pjsip_evsub_state.PJSIP_EVSUB_STATE_ACTIVE) { + if (bi.getPresStatus().getStatus() == + pjsua_buddy_status.PJSUA_BUDDY_STATUS_ONLINE) + { + status = bi.getPresStatus().getStatusText(); + if (status == null || status.length()==0) { + status = "Online"; } - return status; + } else if (bi.getPresStatus().getStatus() == + pjsua_buddy_status.PJSUA_BUDDY_STATUS_OFFLINE) + { + status = "Offline"; + } else { + status = "Unknown"; + } } + return status; + } + + @Override + public void onBuddyState() + { + MyApp.observer.notifyBuddyState(this); + } - @Override - public void onBuddyState() { - MyApp.observer.notifyBuddyState(this); - } - } -class MyAccountConfig { - public AccountConfig accCfg = new AccountConfig(); - public ArrayList buddyCfgs = new ArrayList(); - - public void readObject(ContainerNode node) { - try { - ContainerNode acc_node = node.readContainer("Account"); - accCfg.readObject(acc_node); - ContainerNode buddies_node = acc_node.readArray("buddies"); - buddyCfgs.clear(); - while (buddies_node.hasUnread()) { - BuddyConfig bud_cfg = new BuddyConfig(); - bud_cfg.readObject(buddies_node); - buddyCfgs.add(bud_cfg); - } - } catch (Exception e) {} - } - - public void writeObject(ContainerNode node) { - try { - ContainerNode acc_node = node.writeNewContainer("Account"); - accCfg.writeObject(acc_node); - ContainerNode buddies_node = acc_node.writeNewArray("buddies"); - for (int j = 0; j < buddyCfgs.size(); j++) { - buddyCfgs.get(j).writeObject(buddies_node); - } - } catch (Exception e) {} - } +class MyAccountConfig +{ + public AccountConfig accCfg = new AccountConfig(); + public ArrayList buddyCfgs = new ArrayList(); + + public void readObject(ContainerNode node) + { + try { + ContainerNode acc_node = node.readContainer("Account"); + accCfg.readObject(acc_node); + ContainerNode buddies_node = acc_node.readArray("buddies"); + buddyCfgs.clear(); + while (buddies_node.hasUnread()) { + BuddyConfig bud_cfg = new BuddyConfig(); + bud_cfg.readObject(buddies_node); + buddyCfgs.add(bud_cfg); + } + } catch (Exception e) {} + } + + public void writeObject(ContainerNode node) + { + try { + ContainerNode acc_node = node.writeNewContainer("Account"); + accCfg.writeObject(acc_node); + ContainerNode buddies_node = acc_node.writeNewArray("buddies"); + for (int j = 0; j < buddyCfgs.size(); j++) { + buddyCfgs.get(j).writeObject(buddies_node); + } + } catch (Exception e) {} + } } class MyApp { - static { - try{ - System.loadLibrary("openh264"); - System.loadLibrary("yuv"); - } catch (UnsatisfiedLinkError e) { - System.out.println("UnsatisfiedLinkError: " + e.getMessage()); - System.out.println("This could be safely ignored if you " + - "don't need video."); - } - System.loadLibrary("pjsua2"); - System.out.println("Library loaded"); + static { + try{ + System.loadLibrary("openh264"); + System.loadLibrary("yuv"); + } catch (UnsatisfiedLinkError e) { + System.out.println("UnsatisfiedLinkError: " + e.getMessage()); + System.out.println("This could be safely ignored if you " + + "don't need video."); } - - public static Endpoint ep = new Endpoint(); - public static MyAppObserver observer; - public ArrayList accList = new ArrayList(); - - private ArrayList accCfgs = new ArrayList(); - private EpConfig epConfig = new EpConfig(); - private TransportConfig sipTpConfig = new TransportConfig(); - private String appDir; - - /* Maintain reference to log writer to avoid premature cleanup by GC */ - private MyLogWriter logWriter; - - private final String configName = "pjsua2.json"; - private final int SIP_PORT = 6000; - private final int LOG_LEVEL = 4; - - public void init(MyAppObserver obs, String app_dir) { - init(obs, app_dir, false); + System.loadLibrary("pjsua2"); + System.out.println("Library loaded"); + } + + public static Endpoint ep = new Endpoint(); + public static MyAppObserver observer; + public ArrayList accList = new ArrayList(); + + private ArrayList accCfgs = + new ArrayList(); + private EpConfig epConfig = new EpConfig(); + private TransportConfig sipTpConfig = new TransportConfig(); + private String appDir; + + /* Maintain reference to log writer to avoid premature cleanup by GC */ + private MyLogWriter logWriter; + + private final String configName = "pjsua2.json"; + private final int SIP_PORT = 6000; + private final int LOG_LEVEL = 4; + + public void init(MyAppObserver obs, String app_dir) + { + init(obs, app_dir, false); + } + + public void init(MyAppObserver obs, String app_dir, + boolean own_worker_thread) + { + observer = obs; + appDir = app_dir; + + /* Create endpoint */ + try { + ep.libCreate(); + } catch (Exception e) { + return; } - - public void init(MyAppObserver obs, String app_dir, boolean own_worker_thread) { - observer = obs; - appDir = app_dir; - - /* Create endpoint */ - try { - ep.libCreate(); - } catch (Exception e) { - return; - } - - - /* Load config */ - String configPath = appDir + "/" + configName; - File f = new File(configPath); - if (f.exists()) { - loadConfig(configPath); - } else { - /* Set 'default' values */ - sipTpConfig.setPort(SIP_PORT); - } - - /* Override log level setting */ - epConfig.getLogConfig().setLevel(LOG_LEVEL); - epConfig.getLogConfig().setConsoleLevel(LOG_LEVEL); - - /* Set log config. */ - LogConfig log_cfg = epConfig.getLogConfig(); - logWriter = new MyLogWriter(); - log_cfg.setWriter(logWriter); - log_cfg.setDecor(log_cfg.getDecor() & - ~(pj_log_decoration.PJ_LOG_HAS_CR.swigValue() | - pj_log_decoration.PJ_LOG_HAS_NEWLINE.swigValue())); - - /* Set ua config. */ - UaConfig ua_cfg = epConfig.getUaConfig(); - ua_cfg.setUserAgent("Pjsua2 Android " + ep.libVersion().getFull()); - StringVector stun_servers = new StringVector(); - stun_servers.add("stun.pjsip.org"); - ua_cfg.setStunServer(stun_servers); - if (own_worker_thread) { - ua_cfg.setThreadCnt(0); - ua_cfg.setMainThreadOnly(true); - } - - /* Init endpoint */ - try { - ep.libInit(epConfig); - } catch (Exception e) { - return; - } - - /* Create transports. */ - try { - ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_UDP, sipTpConfig); - } catch (Exception e) { - System.out.println(e); - } - try { - ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_TCP, sipTpConfig); - } catch (Exception e) { - System.out.println(e); - } - - /* Create accounts. */ - for (int i = 0; i < accCfgs.size(); i++) { - MyAccountConfig my_cfg = accCfgs.get(i); - MyAccount acc = addAcc(my_cfg.accCfg); - if (acc == null) - continue; - - /* Add Buddies */ - for (int j = 0; j < my_cfg.buddyCfgs.size(); j++) { - BuddyConfig bud_cfg = my_cfg.buddyCfgs.get(j); - acc.addBuddy(bud_cfg); - } - } - /* Start. */ - try { - ep.libStart(); - } catch (Exception e) { - return; - } + /* Load config */ + String configPath = appDir + "/" + configName; + File f = new File(configPath); + if (f.exists()) { + loadConfig(configPath); + } else { + /* Set 'default' values */ + sipTpConfig.setPort(SIP_PORT); } - - public MyAccount addAcc(AccountConfig cfg) { - MyAccount acc = new MyAccount(cfg); - try { - acc.create(cfg); - } catch (Exception e) { - acc = null; - return null; - } - - accList.add(acc); - return acc; + + /* Override log level setting */ + epConfig.getLogConfig().setLevel(LOG_LEVEL); + epConfig.getLogConfig().setConsoleLevel(LOG_LEVEL); + + /* Set log config. */ + LogConfig log_cfg = epConfig.getLogConfig(); + logWriter = new MyLogWriter(); + log_cfg.setWriter(logWriter); + log_cfg.setDecor(log_cfg.getDecor() & + ~(pj_log_decoration.PJ_LOG_HAS_CR.swigValue() | + pj_log_decoration.PJ_LOG_HAS_NEWLINE.swigValue())); + + /* Set ua config. */ + UaConfig ua_cfg = epConfig.getUaConfig(); + ua_cfg.setUserAgent("Pjsua2 Android " + ep.libVersion().getFull()); + StringVector stun_servers = new StringVector(); + stun_servers.add("stun.pjsip.org"); + ua_cfg.setStunServer(stun_servers); + if (own_worker_thread) { + ua_cfg.setThreadCnt(0); + ua_cfg.setMainThreadOnly(true); } - - public void delAcc(MyAccount acc) { - accList.remove(acc); + + /* Init endpoint */ + try { + ep.libInit(epConfig); + } catch (Exception e) { + return; } - - private void loadConfig(String filename) { - JsonDocument json = new JsonDocument(); - - try { - /* Load file */ - json.loadFile(filename); - ContainerNode root = json.getRootContainer(); - - /* Read endpoint config */ - epConfig.readObject(root); - - /* Read transport config */ - ContainerNode tp_node = root.readContainer("SipTransport"); - sipTpConfig.readObject(tp_node); - - /* Read account configs */ - accCfgs.clear(); - ContainerNode accs_node = root.readArray("accounts"); - while (accs_node.hasUnread()) { - MyAccountConfig acc_cfg = new MyAccountConfig(); - acc_cfg.readObject(accs_node); - accCfgs.add(acc_cfg); - } - } catch (Exception e) { - System.out.println(e); - } - - /* Force delete json now, as I found that Java somehow destroys it - * after lib has been destroyed and from non-registered thread. - */ - json.delete(); + + /* Create transports. */ + try { + ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_UDP, + sipTpConfig); + } catch (Exception e) { + System.out.println(e); } - private void buildAccConfigs() { - /* Sync accCfgs from accList */ - accCfgs.clear(); - for (int i = 0; i < accList.size(); i++) { - MyAccount acc = accList.get(i); - MyAccountConfig my_acc_cfg = new MyAccountConfig(); - my_acc_cfg.accCfg = acc.cfg; - - my_acc_cfg.buddyCfgs.clear(); - for (int j = 0; j < acc.buddyList.size(); j++) { - MyBuddy bud = acc.buddyList.get(j); - my_acc_cfg.buddyCfgs.add(bud.cfg); - } - - accCfgs.add(my_acc_cfg); - } + try { + ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_TCP, + sipTpConfig); + } catch (Exception e) { + System.out.println(e); } - - private void saveConfig(String filename) { - JsonDocument json = new JsonDocument(); - - try { - /* Write endpoint config */ - json.writeObject(epConfig); - - /* Write transport config */ - ContainerNode tp_node = json.writeNewContainer("SipTransport"); - sipTpConfig.writeObject(tp_node); - - /* Write account configs */ - buildAccConfigs(); - ContainerNode accs_node = json.writeNewArray("accounts"); - for (int i = 0; i < accCfgs.size(); i++) { - accCfgs.get(i).writeObject(accs_node); - } - - /* Save file */ - json.saveFile(filename); - } catch (Exception e) {} - - /* Force delete json now, as I found that Java somehow destroys it - * after lib has been destroyed and from non-registered thread. - */ - json.delete(); + + /* Create accounts. */ + for (int i = 0; i < accCfgs.size(); i++) { + MyAccountConfig my_cfg = accCfgs.get(i); + MyAccount acc = addAcc(my_cfg.accCfg); + if (acc == null) + continue; + + /* Add Buddies */ + for (int j = 0; j < my_cfg.buddyCfgs.size(); j++) { + BuddyConfig bud_cfg = my_cfg.buddyCfgs.get(j); + acc.addBuddy(bud_cfg); + } } - - public void deinit() { - String configPath = appDir + "/" + configName; - saveConfig(configPath); - - /* Try force GC to avoid late destroy of PJ objects as they should be - * deleted before lib is destroyed. - */ - Runtime.getRuntime().gc(); - - /* Shutdown pjsua. Note that Endpoint destructor will also invoke - * libDestroy(), so this will be a test of double libDestroy(). - */ - try { - ep.libDestroy(); - } catch (Exception e) {} - - /* Force delete Endpoint here, to avoid deletion from a non- - * registered thread (by GC?). - */ - ep.delete(); - ep = null; - } + + /* Start. */ + try { + ep.libStart(); + } catch (Exception e) { + return; + } + } + + public MyAccount addAcc(AccountConfig cfg) + { + MyAccount acc = new MyAccount(cfg); + try { + acc.create(cfg); + } catch (Exception e) { + acc = null; + return null; + } + + accList.add(acc); + return acc; + } + + public void delAcc(MyAccount acc) + { + accList.remove(acc); + } + + private void loadConfig(String filename) + { + JsonDocument json = new JsonDocument(); + + try { + /* Load file */ + json.loadFile(filename); + ContainerNode root = json.getRootContainer(); + + /* Read endpoint config */ + epConfig.readObject(root); + + /* Read transport config */ + ContainerNode tp_node = root.readContainer("SipTransport"); + sipTpConfig.readObject(tp_node); + + /* Read account configs */ + accCfgs.clear(); + ContainerNode accs_node = root.readArray("accounts"); + while (accs_node.hasUnread()) { + MyAccountConfig acc_cfg = new MyAccountConfig(); + acc_cfg.readObject(accs_node); + accCfgs.add(acc_cfg); + } + } catch (Exception e) { + System.out.println(e); + } + + /* Force delete json now, as I found that Java somehow destroys it + * after lib has been destroyed and from non-registered thread. + */ + json.delete(); + } + + private void buildAccConfigs() + { + /* Sync accCfgs from accList */ + accCfgs.clear(); + for (int i = 0; i < accList.size(); i++) { + MyAccount acc = accList.get(i); + MyAccountConfig my_acc_cfg = new MyAccountConfig(); + my_acc_cfg.accCfg = acc.cfg; + + my_acc_cfg.buddyCfgs.clear(); + for (int j = 0; j < acc.buddyList.size(); j++) { + MyBuddy bud = acc.buddyList.get(j); + my_acc_cfg.buddyCfgs.add(bud.cfg); + } + + accCfgs.add(my_acc_cfg); + } + } + + private void saveConfig(String filename) + { + JsonDocument json = new JsonDocument(); + + try { + /* Write endpoint config */ + json.writeObject(epConfig); + + /* Write transport config */ + ContainerNode tp_node = json.writeNewContainer("SipTransport"); + sipTpConfig.writeObject(tp_node); + + /* Write account configs */ + buildAccConfigs(); + ContainerNode accs_node = json.writeNewArray("accounts"); + for (int i = 0; i < accCfgs.size(); i++) { + accCfgs.get(i).writeObject(accs_node); + } + + /* Save file */ + json.saveFile(filename); + } catch (Exception e) {} + + /* Force delete json now, as I found that Java somehow destroys it + * after lib has been destroyed and from non-registered thread. + */ + json.delete(); + } + + public void deinit() + { + String configPath = appDir + "/" + configName; + saveConfig(configPath); + + /* Try force GC to avoid late destroy of PJ objects as they should be + * deleted before lib is destroyed. + */ + Runtime.getRuntime().gc(); + + /* Shutdown pjsua. Note that Endpoint destructor will also invoke + * libDestroy(), so this will be a test of double libDestroy(). + */ + try { + ep.libDestroy(); + } catch (Exception e) {} + + /* Force delete Endpoint here, to avoid deletion from a non- + * registered thread (by GC?). + */ + ep.delete(); + ep = null; + } } -- cgit v1.2.3