Added receive call behaviour and also did some refactoring

This commit is contained in:
Ziver Koc 2014-08-11 11:34:41 +02:00
parent f72e6e9e53
commit 99c21bf92b
3 changed files with 164 additions and 32 deletions

View file

@ -0,0 +1,58 @@
package com.ericsson.uecontrol.core.behaviour;
import android.content.Context;
import android.telephony.TelephonyManager;
import com.ericsson.uecontrol.core.UeBehaviour;
import com.ericsson.uecontrol.core.util.CallUtil;
import com.ericsson.uecontrol.gui.MainActivity;
import com.ericsson.uecontrol.gui.util.Configurator.Configurable;
import org.apache.log4j.Logger;
import java.lang.reflect.InvocationTargetException;
/**
* This behaviour simulates an idle period for the device.
*
* Created by ezivkoc on 2014-07-15.
*/
public class UeBehaviourReceiveCall extends UeBehaviour{
private static final Logger log = Logger.getLogger(UeBehaviourReceiveCall.class);
public static final int SLEEP_PERIOD = 200;
@Override
protected void execute() throws InterruptedException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Context context = MainActivity.getContext();
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
// Wait to receive Call
while(tm.getCallState() != TelephonyManager.CALL_STATE_RINGING ){
if(super.stopExecution())
return;
Thread.sleep(SLEEP_PERIOD);
}
log.debug("Phone is ringing, answering call");
// Wait for call to end
while(tm.getCallState() != TelephonyManager.CALL_STATE_IDLE){
if(super.stopExecution())
return;
Thread.sleep(SLEEP_PERIOD);
}
log.debug("Call has ended");
}
@Override
public String getName() {
return "Receive Call";
}
@Override
public String toString() {
return "Will wait for a call and then answer it";
}
}

View file

@ -6,6 +6,7 @@ import android.net.Uri;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import com.ericsson.uecontrol.core.UeBehaviour; import com.ericsson.uecontrol.core.UeBehaviour;
import com.ericsson.uecontrol.core.util.CallUtil;
import com.ericsson.uecontrol.gui.MainActivity; import com.ericsson.uecontrol.gui.MainActivity;
import com.ericsson.uecontrol.gui.util.Configurator.Configurable; import com.ericsson.uecontrol.gui.util.Configurator.Configurable;
@ -21,7 +22,7 @@ import java.lang.reflect.Method;
*/ */
public class UeBehaviourSpeechCall extends UeBehaviour{ public class UeBehaviourSpeechCall extends UeBehaviour{
private static final Logger log = Logger.getLogger(UeBehaviourSpeechCall.class); private static final Logger log = Logger.getLogger(UeBehaviourSpeechCall.class);
public static final int SLEEP_PERIOD = 100; public static final int SLEEP_PERIOD = 200;
@Configurable("Phone Number") @Configurable("Phone Number")
private String phoneNumber; private String phoneNumber;
@ -39,45 +40,39 @@ public class UeBehaviourSpeechCall extends UeBehaviour{
@Override @Override
protected void execute() throws InterruptedException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { protected void execute() throws InterruptedException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
startCall(); Context context = MainActivity.getContext();
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
// Start Call
log.debug("Calling phone");
CallUtil.startCall(phoneNumber);
// Wait for call to start
log.debug("Waiting for an answer");
while(tm.getCallState() != TelephonyManager.CALL_STATE_OFFHOOK){
if(super.stopExecution())
return;
Thread.sleep(SLEEP_PERIOD);
}
log.debug("Starting call timer");
int elapsedTime = 0; int elapsedTime = 0;
while(elapsedTime < length){ while(elapsedTime < length){
if(super.stopExecution())
return;
super.setProgress((float)elapsedTime/length); super.setProgress((float)elapsedTime/length);
if(super.stopExecution()) break;
Thread.sleep(SLEEP_PERIOD); Thread.sleep(SLEEP_PERIOD);
elapsedTime += SLEEP_PERIOD; elapsedTime += SLEEP_PERIOD;
} }
endCall(); CallUtil.endCall();
}
log.debug("Waiting for call to end");
private void startCall(){ // Wait for call to end
log.debug("Starting Speech Call"); while(tm.getCallState() != TelephonyManager.CALL_STATE_IDLE){
Context context = MainActivity.getContext(); if(super.stopExecution())
Uri number = Uri.parse("tel:" + phoneNumber); return;
Thread.sleep(SLEEP_PERIOD);
Intent intent = new Intent(); }
//intent.setAction(Intent.ACTION_DIAL);
intent.setAction(Intent.ACTION_CALL);
intent.setData(number);
context.startActivity(intent);
}
private void endCall() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {
log.debug("Ending Speech Call");
Context context = MainActivity.getContext();
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
Object telephonyService = m.invoke(tm); // Get the internal ITelephony object
c = Class.forName(telephonyService.getClass().getName()); // Get its class
m = c.getDeclaredMethod("endCall"); // Get the "endCall()" method
m.setAccessible(true); // Make it accessible
m.invoke(telephonyService); // invoke endCall()
} }

View file

@ -0,0 +1,79 @@
package com.ericsson.uecontrol.core.util;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.net.Uri;
import android.telephony.TelephonyManager;
import com.ericsson.uecontrol.gui.MainActivity;
import org.apache.log4j.Logger;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by ezivkoc on 2014-08-11.
*/
public class CallUtil {
private static final Logger log = Logger.getLogger(CallUtil.class);
public static void startCall(String phoneNumber){
log.debug("Starting Speech Call");
Context context = MainActivity.getContext();
Uri number = Uri.parse("tel:" + phoneNumber);
Intent intent = new Intent();
//intent.setAction(Intent.ACTION_DIAL);
intent.setAction(Intent.ACTION_CALL);
intent.setData(number);
context.startActivity(intent);
}
public static void enableSpeakerPhone(boolean enable) {
Context context = MainActivity.getContext();
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setSpeakerphoneOn(enable);
}
private static void answerPhoneAidl() throws Exception {
log.debug("Answering Speech Call");
Object telephonyService = getTelephonyService();
Class c = Class.forName(telephonyService.getClass().getName());
// Silence ringer
Method m = c.getDeclaredMethod("silenceRinger");
m.setAccessible(true);
m.invoke(telephonyService);
// Answer Call
m = c.getDeclaredMethod("answerRingingCall");
m.setAccessible(true);
m.invoke(telephonyService);
}
public static void endCall() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {
log.debug("Ending Speech Call");
Object telephonyService = getTelephonyService();
Class c = Class.forName(telephonyService.getClass().getName()); // Get its class
Method m = c.getDeclaredMethod("endCall"); // Get the "endCall()" method
m.setAccessible(true); // Make it accessible
m.invoke(telephonyService); // invoke endCall()
}
private static Object getTelephonyService() throws InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException {
Context context = MainActivity.getContext();
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
return m.invoke(tm);
}
}