/** * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr) * This file is part of CSipSimple. * * CSipSimple 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 3 of the License, or * (at your option) any later version. * If you own a pjsip commercial license you can also redistribute it * and/or modify it under the terms of the GNU Lesser General Public License * as an android library. * * CSipSimple 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 CSipSimple. If not, see <http://www.gnu.org/licenses/>. */ package com.csipsimple.ui.prefs; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.ProgressBar; import android.widget.TextView; import com.csipsimple.R; import com.csipsimple.api.ISipService; import com.csipsimple.api.SipManager; import com.csipsimple.service.SipService; public class AudioTester extends Activity implements OnClickListener { private final static String THIS_FILE = "AudioTester"; int currentStatus = R.string.test_audio_prepare; private TextView statusTextView; private ProgressBar txProgress; private ProgressBar rxProgress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.audio_test_view); statusTextView = (TextView) findViewById(R.id.audio_test_text); rxProgress = (ProgressBar) findViewById(R.id.rx_bar); txProgress = (ProgressBar) findViewById(R.id.tx_bar); findViewById(R.id.cancel_bt).setOnClickListener(this); } private ISipService service; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { service = ISipService.Stub.asInterface(arg1); if (service != null) { try { int res = service.startLoopbackTest(); if (res == SipManager.SUCCESS) { currentStatus = R.string.test_audio_ongoing; } else { currentStatus = R.string.test_audio_network_failure; } updateStatusDisplay(); } catch (RemoteException e) { Log.e(THIS_FILE, "Error in test", e); } } } @Override public void onServiceDisconnected(ComponentName arg0) { if (service != null) { try { service.stopLoopbackTest(); } catch (RemoteException e) { Log.e(THIS_FILE, "Error in test", e); } } service = null; } }; @Override protected void onResume() { super.onResume(); currentStatus = R.string.test_audio_prepare; updateStatusDisplay(); bindService(new Intent(this, SipService.class), connection, Context.BIND_AUTO_CREATE); if (monitorThread == null) { monitorThread = new MonitorThread(); monitorThread.start(); } } @Override protected void onPause() { super.onPause(); if (service != null) { try { service.stopLoopbackTest(); } catch (RemoteException e) { Log.e(THIS_FILE, "Error in test", e); } } if (connection != null) { unbindService(connection); } if (monitorThread != null) { monitorThread.markFinished(); monitorThread = null; } } private void updateStatusDisplay() { if (statusTextView != null) { statusTextView.setText(currentStatus); } } private MonitorThread monitorThread; private class MonitorThread extends Thread { private boolean finished = false; public synchronized void markFinished() { finished = true; } @Override public void run() { super.run(); while (true) { if (service != null) { try { long value = service.confGetRxTxLevel(0); runOnUiThread(new UpdateConfLevelRunnable((int) ((value >> 8) & 0xff), (int) (value & 0xff))); } catch (RemoteException e) { Log.e(THIS_FILE, "Problem with remote service", e); break; } } // End of loop, sleep for a while and exit if necessary try { sleep(100); } catch (InterruptedException e) { Log.e(THIS_FILE, "Interupted monitor thread", e); } synchronized (this) { if (finished) { break; } } } } private class UpdateConfLevelRunnable implements Runnable { private final int mRx; private final int mTx; UpdateConfLevelRunnable(int rx, int tx){ mRx = rx; mTx = tx; } @Override public void run() { rxProgress.setProgress(mRx); txProgress.setProgress(mTx); } } } @Override public void onClick(View v) { int id = v.getId(); if(id == R.id.cancel_bt) { finish(); } } }