From f5e95e683cbbff4ac821575ddc33111046da5408 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Wed, 6 Aug 2014 16:35:03 +0200 Subject: [PATCH] Fixed issue where Run button was showing wrong state --- .idea/dictionaries/ezivkoc.xml | 8 ++++ .../ericsson/uecontrol/core/UeBehaviour.java | 8 ++-- .../uecontrol/core/UeControlExecutor.java | 20 ++++++--- .../core/behaviour/UeBehaviourSendSMS.java | 20 ++++++--- .../ericsson/uecontrol/gui/MainActivity.java | 43 ++++++++++++------- 5 files changed, 69 insertions(+), 30 deletions(-) create mode 100755 .idea/dictionaries/ezivkoc.xml diff --git a/.idea/dictionaries/ezivkoc.xml b/.idea/dictionaries/ezivkoc.xml new file mode 100755 index 0000000..24f7f13 --- /dev/null +++ b/.idea/dictionaries/ezivkoc.xml @@ -0,0 +1,8 @@ + + + + ericsson + parsable + + + \ No newline at end of file diff --git a/app/src/main/java/com/ericsson/uecontrol/core/UeBehaviour.java b/app/src/main/java/com/ericsson/uecontrol/core/UeBehaviour.java index f6098b8..2a28cd4 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/UeBehaviour.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/UeBehaviour.java @@ -16,12 +16,15 @@ public abstract class UeBehaviour implements Serializable{ private transient BehaviourExecutionListener execListener; private transient DataHandledListener datahandledListener; + + public synchronized void preRun() { + running = true; + } + /** * Starts to run the behaviour, this method will block until the execution is done */ public void run(){ - running = true; - if(execListener != null) execListener.executionStarted(); try { setProgress(0); @@ -101,7 +104,6 @@ public abstract class UeBehaviour implements Serializable{ public abstract String toString(); - public static interface BehaviourExecutionListener { public void executionStarted(); public void progressChanged(float progress); diff --git a/app/src/main/java/com/ericsson/uecontrol/core/UeControlExecutor.java b/app/src/main/java/com/ericsson/uecontrol/core/UeControlExecutor.java index 3043c1b..b8c6279 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/UeControlExecutor.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/UeControlExecutor.java @@ -63,19 +63,21 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe } - public void execute(){ + public synchronized void execute(){ if(thread == null || !thread.isAlive()) { terminate = false; thread = new Thread(this); thread.start(); + synchronized (thread){ + try { thread.wait(); }catch(InterruptedException e) {log.error(null,e);} + } } } - public void terminate(){ + public synchronized void terminate(){ terminate = true; - if(currentlyActive != null); + if(currentlyActive != null) currentlyActive.terminate(); - currentlyActive = null; } public boolean isRunning(){ @@ -85,15 +87,23 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe } public void run(){ + log.info("Starting execution"); while(!terminate) { if(behaviours.isEmpty()) { currentlyActive = null; terminate(); + synchronized (thread){thread.notifyAll();} break; } else if (currentlyActive == null) currentlyActive = behaviours.get(0); + // Notify threads that started execution that we are now running + synchronized (thread){ + currentlyActive.preRun(); + thread.notifyAll(); + } + // Run behaviour log.info("Running behaviour: " + currentlyActive.getName()); currentlyActive.run(); @@ -112,7 +122,7 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe @Override public void handledIncomingData(long size) { if (!setRealDataUsage()){ - // TrafficStat unsupported so try to us estimation instead + // TrafficStat unsupported so try to use estimation instead downloadSpeed.setHandledData(size); } if (throughputListener != null && downloadSpeed.isUpdated()) diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSendSMS.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSendSMS.java index 1d69865..b831f61 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSendSMS.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSendSMS.java @@ -22,7 +22,7 @@ public class UeBehaviourSendSMS extends UeBehaviour{ private static final Logger log = Logger.getLogger(UeBehaviourSendSMS.class); private static final String INTENT_ACTION_SENT = "SMS_SENT"; private static final String INTENT_ACTION_DELIVERED = "SMS_DELIVERED"; - private static final int SLEEP_PERIOD = 200; + private static final int SLEEP_PERIOD = 300; private static enum MessageStatus{ UNKNOWN, MESSAGE_SENT, MESSAGE_DELIVERED, MESSAGE_SEND_ERROR, MESSAGE_CANCELED @@ -37,9 +37,15 @@ public class UeBehaviourSendSMS extends UeBehaviour{ private transient Exception exception; private transient BroadcastReceiver sentBroadcastReceiver = new BroadcastReceiver() { - public void onReceive(Context arg0, Intent arg1) { setSendingStatus(getResultCode()); }}; + public void onReceive(Context arg0, Intent arg1) { + setSendingStatus(getResultCode()); + } + }; private transient BroadcastReceiver deliveryBroadcastReceiver = new BroadcastReceiver() { - public void onReceive(Context arg0, Intent arg1) { setDeliveryStatus(getResultCode()); }}; + public void onReceive(Context arg0, Intent arg1) { + setDeliveryStatus(getResultCode()); + } + }; @Override protected void execute() throws Exception { @@ -61,18 +67,20 @@ public class UeBehaviourSendSMS extends UeBehaviour{ log.debug("Sending message"); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); - this.setProgress(1/3); + this.setProgress(1/3f); // Wait for the message sending + log.debug("Waiting for message delivery"); while(status != MessageStatus.MESSAGE_DELIVERED || status != MessageStatus.MESSAGE_CANCELED){ if(status == MessageStatus.MESSAGE_SENT) - this.setProgress(2/3); + this.setProgress(2/3f); Thread.sleep(SLEEP_PERIOD); } - this.setProgress(3/3); + this.setProgress(1f); // Cleanup + log.debug("Cleanup"); context.unregisterReceiver(sentBroadcastReceiver); context.unregisterReceiver(deliveryBroadcastReceiver); } diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java b/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java index 67ddfb8..e6fbea8 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java @@ -64,10 +64,11 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference statusFragment = (StatusFragment) getFragmentManager().findFragmentById(R.id.status_fragment); getFragmentManager().beginTransaction() - .replace(R.id.container, BehaviourListFragment.newInstance()).commit(); - action_execute = (MenuItem) findViewById(R.id.action_execute); + .replace(R.id.container, new BehaviourListFragment()).commit(); + if(currentExecutor == null) { + log.info("Creating new instance of executor"); currentExecutor = new UeControlExecutor(); currentExecutor.setThroughputListener(statusFragment.getThroughputListener()); File input = new File(this.getFilesDir(), BEHAVIOUR_SAVE_FILE); @@ -86,6 +87,8 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference currentExecutor.addBehaviour(new UeBehaviourSleep(4000)); } } + else + log.info("Using existing executor"); updateExecutionState(); } @@ -132,6 +135,8 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true); + action_execute = (MenuItem) menu.findItem(R.id.action_execute); + updateExecutionState(); return true; } @@ -144,6 +149,18 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_execute) { + if(currentExecutor.isRunning()) { + currentExecutor.terminate(); + csvLogger = null; + } + else { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + if(prefs.getBoolean("logging", true)) + csvLogger = new CSVWriter(this); + else + csvLogger = null; + currentExecutor.execute(); + } updateExecutionState(); return true; } @@ -164,19 +181,11 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference } private void updateExecutionState(){ - if(currentExecutor.isRunning()){ - currentExecutor.terminate(); - action_execute.setTitle(R.string.action_run); - csvLogger = null; - } - else { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - if(prefs.getBoolean("logging", true)) - csvLogger = new CSVWriter(this); + if(action_execute != null) { + if (currentExecutor.isRunning()) + action_execute.setTitle(R.string.action_stop); else - csvLogger = null; - currentExecutor.execute(); - action_execute.setTitle(R.string.action_stop); + action_execute.setTitle(R.string.action_run); } } @@ -184,6 +193,10 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference @Override public void onBackPressed() { if (backButtonPressed) { + if(currentExecutor != null){ + log.info("Terminating executor"); + currentExecutor.terminate(); + } super.onBackPressed(); return; } @@ -200,8 +213,6 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference } - - public static void logThroughput(double downThroughput, double upThroughput) { if(csvLogger == null || currentExecutor == null || currentExecutor.getRunningBehaviour() == null) return;