From e00d1fcb6280f316729741c2169b8f8e56151e1e Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Tue, 16 Sep 2014 15:56:32 +0200 Subject: [PATCH] Decoupled throughput updates from behaviours Optimized imports --- .../ericsson/uecontrol/core/UeBehaviour.java | 22 --- .../uecontrol/core/UeControlExecutor.java | 126 ++++++++++-------- .../behaviour/UeBehaviourFileDownload.java | 1 - .../behaviour/UeBehaviourFtpDownload.java | 6 - .../core/behaviour/UeBehaviourFtpUpload.java | 2 - .../behaviour/UeBehaviourReceiveCall.java | 3 - .../core/behaviour/UeBehaviourSendSMS.java | 1 - .../core/behaviour/UeBehaviourSpeechCall.java | 5 - .../core/behaviour/UeBehaviourSurfing.java | 5 - .../behaviour/UeBehaviourVideoStreaming.java | 3 +- .../core/util/AbstractElementAdapter.java | 10 +- .../ericsson/uecontrol/gui/AboutActivity.java | 1 - .../ericsson/uecontrol/gui/EditActivity.java | 2 - .../gui/fragments/FileBrowserDialog.java | 10 +- .../gui/fragments/SelectBehaviourDialog.java | 3 - .../gui/fragments/StatusFragment.java | 7 - .../uecontrol/gui/util/CSVWriter.java | 3 - 17 files changed, 83 insertions(+), 127 deletions(-) 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 a5e8b2c..7095f5e 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/UeBehaviour.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/UeBehaviour.java @@ -14,7 +14,6 @@ public abstract class UeBehaviour implements Serializable{ private transient boolean running; private transient BehaviourExecutionListener execListener; - private transient DataHandledListener datahandledListener; public synchronized void preRun() { @@ -58,23 +57,6 @@ public abstract class UeBehaviour implements Serializable{ protected void setProgress(float progress){ if(execListener != null) execListener.progressChanged(progress); - - // TODO: This is a dirty way of updating the throughput, should be changed - if(datahandledListener != null) - datahandledListener.handledIncomingData(0); - } - - public void setDataHandledListener(DataHandledListener listener) { - datahandledListener = listener; - } - - protected void setHandledIncomingData(long size){ - if(datahandledListener != null) - datahandledListener.handledIncomingData(size); - } - protected void setHandledOutgoingData(long size){ - if(datahandledListener != null) - datahandledListener.handledOutgoingData(size); } /** @@ -105,8 +87,4 @@ public abstract class UeBehaviour implements Serializable{ public void exception(Exception e); } - public static interface DataHandledListener { - public void handledIncomingData(long size); - public void handledOutgoingData(long size); - } } 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 d7eb466..1cbb6a0 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/UeControlExecutor.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/UeControlExecutor.java @@ -1,6 +1,7 @@ package com.ericsson.uecontrol.core; import android.net.TrafficStats; +import android.os.Handler; import com.ericsson.uecontrol.core.util.AbstractElementAdapter; import com.ericsson.uecontrol.core.util.ThroughputCalculator; @@ -11,15 +12,9 @@ import com.google.gson.reflect.TypeToken; import org.apache.log4j.Logger; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutput; -import java.io.ObjectOutputStream; -import java.io.Writer; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; @@ -27,7 +22,7 @@ import java.util.List; /** * Created by ezivkoc on 2014-07-15. */ -public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListener { +public class UeControlExecutor implements Runnable{ private static final Logger log = Logger.getLogger(UeControlExecutor.class); private ArrayList behaviours; @@ -36,19 +31,15 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe private Thread thread; private Gson gson; - private long previousRxBytes = TrafficStats.UNSUPPORTED; - private long previousTxBytes = TrafficStats.UNSUPPORTED; - private boolean deviceBasedThroughput; - private ThroughputCalculator downloadSpeed; - private ThroughputCalculator uploadSpeed; + private Handler handler; + private ThroughputUpdateRunnable throughputUpdateRunnable; private ThroughputListener throughputListener; public UeControlExecutor(){ behaviours = new ArrayList(); - downloadSpeed = new ThroughputCalculator(); - uploadSpeed = new ThroughputCalculator(); - deviceBasedThroughput = false; + handler = new Handler(); + throughputUpdateRunnable = new ThroughputUpdateRunnable(); gson = new GsonBuilder() .registerTypeAdapter(UeBehaviour.class, new AbstractElementAdapter()) @@ -57,7 +48,6 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe public void addBehaviour(UeBehaviour b){ behaviours.add(b); - b.setDataHandledListener(this); } public void read(String file) throws Exception { @@ -78,8 +68,13 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe } + public synchronized void execute(){ if(!isRunning()) { + // Start throughput reader scheduler + handler.postDelayed(throughputUpdateRunnable, 100); + + // Start Execution terminate = false; thread = new Thread(this); thread.start(); @@ -92,6 +87,7 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe } private void terminateNonBlock(){ + handler.removeCallbacks(throughputUpdateRunnable); terminate = true; if(currentlyActive != null) currentlyActive.terminate(); @@ -116,6 +112,8 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe currentlyActive = null; } + + public boolean isRunning(){ return thread != null && thread.isAlive(); } @@ -154,53 +152,12 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe } - @Override - public void handledIncomingData(long size) { - if (!setRealDataUsage()){ - // TrafficStat unsupported so try to use estimation instead - downloadSpeed.setHandledData(size); - } - if (throughputListener != null && downloadSpeed.isUpdated()) - throughputListener.throughputUpdate(downloadSpeed.getBitThroughput(), uploadSpeed.getBitThroughput()); - } - @Override - public void handledOutgoingData(long size) { - if (!setRealDataUsage()) { - // TrafficStat unsupported so try to us estimation instead - uploadSpeed.setHandledData(size); - } - if (throughputListener != null && uploadSpeed.isUpdated()) - throughputListener.throughputUpdate(downloadSpeed.getBitThroughput(), uploadSpeed.getBitThroughput()); - } - protected boolean setRealDataUsage(){ - boolean ret = false; - long currentRxBytes = 0; - long currentTxBytes = 0; - if(deviceBasedThroughput) { - currentRxBytes = TrafficStats.getTotalRxBytes(); - currentTxBytes = TrafficStats.getTotalTxBytes(); - } - else{ - currentRxBytes = TrafficStats.getUidRxBytes(MainActivity.getUID()); - currentTxBytes = TrafficStats.getUidTxBytes(MainActivity.getUID()); - } - - if (currentRxBytes != TrafficStats.UNSUPPORTED && currentTxBytes != TrafficStats.UNSUPPORTED - && previousRxBytes != TrafficStats.UNSUPPORTED && previousTxBytes != TrafficStats.UNSUPPORTED){ - downloadSpeed.setHandledData(currentRxBytes-previousRxBytes); - uploadSpeed.setHandledData(currentTxBytes-previousTxBytes); - ret = true; - } - previousRxBytes = currentRxBytes; - previousTxBytes = currentTxBytes; - return ret; - } public void setThroughputListener(ThroughputListener listener){ throughputListener = listener; } public void setDeviceBasedThroughput(boolean enable){ - deviceBasedThroughput = enable; + throughputUpdateRunnable.deviceBasedThroughput = enable; } public List getBehaviourList() { @@ -214,4 +171,57 @@ public class UeControlExecutor implements Runnable, UeBehaviour.DataHandledListe public static interface ThroughputListener{ public void throughputUpdate(double downThroughput, double upThroughput); } + + + + private class ThroughputUpdateRunnable implements Runnable{ + protected boolean deviceBasedThroughput; + + private long previousRxBytes = TrafficStats.UNSUPPORTED; + private long previousTxBytes = TrafficStats.UNSUPPORTED; + private ThroughputCalculator downloadSpeed; + private ThroughputCalculator uploadSpeed; + + + public ThroughputUpdateRunnable(){ + downloadSpeed = new ThroughputCalculator(); + uploadSpeed = new ThroughputCalculator(); + deviceBasedThroughput = false; + } + + public void run(){ + if (!setRealDataUsage()) { + uploadSpeed.setHandledData(0); + downloadSpeed.setHandledData(0); + } + if (throughputListener != null && uploadSpeed.isUpdated()) + throughputListener.throughputUpdate(downloadSpeed.getBitThroughput(), uploadSpeed.getBitThroughput()); + // Rescedule this handler + handler.postDelayed(this, 100); + } + + protected boolean setRealDataUsage(){ + boolean ret = false; + long currentRxBytes = 0; + long currentTxBytes = 0; + if(deviceBasedThroughput) { + currentRxBytes = TrafficStats.getTotalRxBytes(); + currentTxBytes = TrafficStats.getTotalTxBytes(); + } + else{ + currentRxBytes = TrafficStats.getUidRxBytes(MainActivity.getUID()); + currentTxBytes = TrafficStats.getUidTxBytes(MainActivity.getUID()); + } + + if (currentRxBytes != TrafficStats.UNSUPPORTED && currentTxBytes != TrafficStats.UNSUPPORTED + && previousRxBytes != TrafficStats.UNSUPPORTED && previousTxBytes != TrafficStats.UNSUPPORTED){ + downloadSpeed.setHandledData(currentRxBytes - previousRxBytes); + uploadSpeed.setHandledData(currentTxBytes-previousTxBytes); + ret = true; + } + previousRxBytes = currentRxBytes; + previousTxBytes = currentTxBytes; + return ret; + } + } } diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFileDownload.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFileDownload.java index c3f289d..54bd2ef 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFileDownload.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFileDownload.java @@ -41,7 +41,6 @@ public class UeBehaviourFileDownload extends UeBehaviour { while((read = in.read(data)) != -1 && !stopExecution()){ progress += read; super.setProgress((float)progress/estimatedDataLength); - super.setHandledIncomingData(read); } estimatedDataLength = progress; diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpDownload.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpDownload.java index ec923f1..f0c5a73 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpDownload.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpDownload.java @@ -1,15 +1,9 @@ package com.ericsson.uecontrol.core.behaviour; -import com.ericsson.uecontrol.core.UeBehaviour; import com.ericsson.uecontrol.gui.util.Configurator.Configurable; import org.apache.log4j.Logger; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; - /** * This behaviour simulates downloading a file from FTP * diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpUpload.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpUpload.java index a72d0d6..da6024b 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpUpload.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourFtpUpload.java @@ -7,7 +7,6 @@ import com.ericsson.uecontrol.gui.util.Configurator.Configurable; import org.apache.log4j.Logger; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; @@ -49,7 +48,6 @@ public class UeBehaviourFtpUpload extends UeBehaviour { out.write(data, 0, writeLength); total += writeLength; - super.setHandledOutgoingData(writeLength); super.setProgress((float)total/size); } out.close(); diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourReceiveCall.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourReceiveCall.java index c5022fb..7471c4c 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourReceiveCall.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourReceiveCall.java @@ -6,12 +6,9 @@ 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. * 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 44f32d3..450e2d9 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 @@ -7,7 +7,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.telephony.SmsManager; -import android.widget.Toast; import com.ericsson.uecontrol.core.UeBehaviour; import com.ericsson.uecontrol.gui.MainActivity; diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSpeechCall.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSpeechCall.java index 0ee0f27..e911e4b 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSpeechCall.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSpeechCall.java @@ -1,8 +1,6 @@ package com.ericsson.uecontrol.core.behaviour; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.telephony.TelephonyManager; import com.ericsson.uecontrol.core.UeBehaviour; @@ -12,9 +10,6 @@ import com.ericsson.uecontrol.gui.util.Configurator.Configurable; import org.apache.log4j.Logger; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - /** * This behaviour simulates an idle period for the device. * diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSurfing.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSurfing.java index 64c047e..b749177 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSurfing.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourSurfing.java @@ -1,7 +1,5 @@ package com.ericsson.uecontrol.core.behaviour; -import android.util.Log; - import com.ericsson.uecontrol.core.UeBehaviour; import com.ericsson.uecontrol.gui.util.Configurator.Configurable; @@ -14,9 +12,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; -import java.util.Queue; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -93,7 +89,6 @@ public class UeBehaviourSurfing extends UeBehaviour { return; totalRead += read; super.setProgress((float) totalRead / estimatedDataLength); - super.setHandledIncomingData(read); if (cont.parsable) content.append(new String(data, 0, read)); if (content.length() > MAX_BUFFER_SIZE) diff --git a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourVideoStreaming.java b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourVideoStreaming.java index 518308f..9ad1f7a 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourVideoStreaming.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/behaviour/UeBehaviourVideoStreaming.java @@ -9,7 +9,6 @@ import org.apache.log4j.Logger; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; -import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.net.MalformedURLException; @@ -51,7 +50,7 @@ public class UeBehaviourVideoStreaming extends UeBehaviour implements MediaPlaye Thread.sleep(UeBehaviourSleep.SLEEP_PERIOD); while (mp.isPlaying() && playbackException == null) { super.setProgress((float) mp.getCurrentPosition() / mp.getDuration()); - super.setHandledIncomingData(0); // Unable to retrieve the amount of incoming data + if (super.stopExecution()) break; Thread.sleep(UeBehaviourSleep.SLEEP_PERIOD); } diff --git a/app/src/main/java/com/ericsson/uecontrol/core/util/AbstractElementAdapter.java b/app/src/main/java/com/ericsson/uecontrol/core/util/AbstractElementAdapter.java index 868b1f9..03e526b 100755 --- a/app/src/main/java/com/ericsson/uecontrol/core/util/AbstractElementAdapter.java +++ b/app/src/main/java/com/ericsson/uecontrol/core/util/AbstractElementAdapter.java @@ -1,6 +1,14 @@ package com.ericsson.uecontrol.core.util; -import com.google.gson.*; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + import java.lang.reflect.Type; public class AbstractElementAdapter implements JsonSerializer, JsonDeserializer { diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/AboutActivity.java b/app/src/main/java/com/ericsson/uecontrol/gui/AboutActivity.java index 8b2e6b2..9ee22be 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/AboutActivity.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/AboutActivity.java @@ -10,7 +10,6 @@ import com.ericsson.uecontrol.BuildConfig; import org.apache.log4j.Logger; import java.io.BufferedReader; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/EditActivity.java b/app/src/main/java/com/ericsson/uecontrol/gui/EditActivity.java index 1072891..6e2555d 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/EditActivity.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/EditActivity.java @@ -14,13 +14,11 @@ import com.ericsson.uecontrol.core.UeControlExecutor; import com.ericsson.uecontrol.gui.fragments.ConfigureDialog; import com.ericsson.uecontrol.gui.fragments.SelectBehaviourDialog; import com.ericsson.uecontrol.gui.util.BehaviourListAdapter; -import com.ericsson.uecontrol.gui.util.Configurator; import com.ericsson.uecontrol.gui.util.DynamicListView; import org.apache.log4j.Logger; import java.io.File; -import java.util.ArrayList; import java.util.List; public class EditActivity extends ListActivity implements AdapterView.OnItemClickListener { diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java index 592fc74..b966d4c 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java @@ -1,11 +1,6 @@ package com.ericsson.uecontrol.gui.fragments; -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -33,6 +28,11 @@ import com.ericsson.uecontrol.R; import org.apache.log4j.Logger; +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** Allow user to select destination directory and to enter filename. * diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/SelectBehaviourDialog.java b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/SelectBehaviourDialog.java index 91406c9..73adde1 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/SelectBehaviourDialog.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/SelectBehaviourDialog.java @@ -11,9 +11,6 @@ import com.ericsson.uecontrol.core.UeBehaviour; import org.apache.log4j.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class SelectBehaviourDialog extends DialogFragment { private static final Logger log = Logger.getLogger(SelectBehaviourDialog.class); public static String[] behaviourClasses; diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/StatusFragment.java b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/StatusFragment.java index e03436a..d05a5a8 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/StatusFragment.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/StatusFragment.java @@ -1,16 +1,9 @@ package com.ericsson.uecontrol.gui.fragments; import android.app.Fragment; -import android.content.Context; import android.graphics.Color; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.wifi.WifiInfo; -import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; -import android.os.Message; -import android.telephony.TelephonyManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/util/CSVWriter.java b/app/src/main/java/com/ericsson/uecontrol/gui/util/CSVWriter.java index 5680ad9..6f6d4a5 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/util/CSVWriter.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/util/CSVWriter.java @@ -6,9 +6,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.os.Build; import android.preference.PreferenceManager; -import android.telephony.NeighboringCellInfo; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; @@ -21,7 +19,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; -import java.util.List; /** * Created by ezivkoc on 2014-07-30.