blob: aa0f98763dc32dd879b186eb07ab15f1f1d11c0f [file] [log] [blame]
/* $Id: MainActivity.java $ */
/*
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.pjsip.pjsua;
import java.lang.ref.WeakReference;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.util.Log;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
class CONST {
public static final String LIB_FILENAME = "pjsua";
public static final String TAG = "pjsua";
public static final Boolean AUTOKILL_ON_FINISH = true;
public enum MSG_TYPE {
STR_DEBUG,
STR_INFO,
STR_ERROR,
CLI_STOP,
CLI_RESTART,
QUIT
};
}
class LOG {
public static void DEBUG(Handler h, String str) {
Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_DEBUG.ordinal(),
str);
msg.sendToTarget();
}
public static void INFO(Handler h, String str) {
Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_INFO.ordinal(),
str);
msg.sendToTarget();
}
public static void ERROR(Handler h, String str) {
Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_ERROR.ordinal(),
str);
msg.sendToTarget();
}
}
public class MainActivity extends Activity {
private MyHandler ui_handler = new MyHandler(this);
private static MyCallback callback;
private static class MyHandler extends Handler {
private final WeakReference<MainActivity> mTarget;
public MyHandler(MainActivity target) {
mTarget = new WeakReference<MainActivity>(target);
}
@Override
public void handleMessage(Message m) {
MainActivity target = mTarget.get();
if (target == null)
return;
if (m.what == CONST.MSG_TYPE.STR_DEBUG.ordinal()) {
Log.d(CONST.TAG, (String)m.obj);
} else if (m.what == CONST.MSG_TYPE.STR_INFO.ordinal()) {
target.updateStatus((String)m.obj);
Log.i(CONST.TAG, (String)m.obj);
} else if (m.what == CONST.MSG_TYPE.STR_ERROR.ordinal()) {
target.updateStatus((String)m.obj);
Log.e(CONST.TAG, (String)m.obj);
} else if (m.what == CONST.MSG_TYPE.CLI_STOP.ordinal()) {
pjsua.pjsuaDestroy();
LOG.INFO(this, "Telnet Unavailable");
} else if (m.what == CONST.MSG_TYPE.CLI_RESTART.ordinal()) {
int status = pjsua.pjsuaRestart();
if (status != 0) {
LOG.INFO(this, "Failed restarting telnet");
}
} else if (m.what == CONST.MSG_TYPE.QUIT.ordinal()) {
target.finish();
System.gc();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
}
/** Callback object **/
private static class MyCallback extends PjsuaAppCallback {
private WeakReference<Handler> ui_handler;
public MyCallback(Handler in_ui_handler) {
set_ui_handler(in_ui_handler);
}
public void set_ui_handler(Handler in_ui_handler) {
ui_handler = new WeakReference<Handler>(in_ui_handler);
}
@Override
public void onStarted(String msg) {
Handler ui = ui_handler.get();
LOG.INFO(ui, msg);
}
@Override
public void onStopped(int restart) {
Handler ui = ui_handler.get();
/** Use timer to stopped/restart **/
if (restart != 0) {
LOG.INFO(ui, "Telnet Restarting");
Message msg = Message.obtain(ui,
CONST.MSG_TYPE.CLI_RESTART.ordinal());
ui.sendMessageDelayed(msg, 100);
} else {
LOG.INFO(ui, "Telnet Stopping");
Message msg = Message.obtain(ui,
CONST.MSG_TYPE.CLI_STOP.ordinal());
ui.sendMessageDelayed(msg, 100);
}
}
}
private void updateStatus(String output) {
TextView tStatus = (TextView) findViewById(R.id.textStatus);
tStatus.setText(output);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
LOG.DEBUG(ui_handler, "=== Activity::onCreate() ===");
super.onCreate(savedInstanceState);
init_view();
init_lib();
}
@Override
protected void onStart() {
LOG.DEBUG(ui_handler, "=== Activity::onStart() ===");
super.onStart();
}
@Override
protected void onRestart() {
LOG.DEBUG(ui_handler, "=== Activity::onRestart() ===");
super.onRestart();
}
@Override
protected void onResume() {
LOG.DEBUG(ui_handler, "=== Activity::onResume() ===");
super.onResume();
}
@Override
protected void onPause() {
LOG.DEBUG(ui_handler, "=== Activity::onPause() ===");
super.onPause();
}
@Override
protected void onStop() {
LOG.DEBUG(ui_handler, "=== Activity::onStop() ===");
super.onStop();
}
@Override
protected void onDestroy() {
LOG.DEBUG(ui_handler, "=== Activity::onDestroy() ===");
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
private void init_view() {
setContentView(R.layout.activity_main);
}
private int init_lib() {
LOG.INFO(ui_handler, "Loading module...");
try {
System.loadLibrary(CONST.LIB_FILENAME);
} catch (UnsatisfiedLinkError e) {
LOG.ERROR(ui_handler, "UnsatisfiedLinkError: " + e.getMessage());
return -1;
}
// Wait for GDB to init
if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0)
{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
LOG.ERROR(ui_handler, "InterruptedException: " +
e.getMessage());
}
}
// Set callback object
if (callback == null)
callback = new MyCallback(ui_handler);
pjsua.setCallbackObject(callback);
LOG.INFO(ui_handler, "Starting module..");
int rc = pjsua.pjsuaStart();
if (rc != 0) {
LOG.INFO(ui_handler, "Failed starting telnet");
}
return 0;
}
}