From f9c752ab3fa68546d07d26a3c042d31b46e22b2c Mon Sep 17 00:00:00 2001 From: Tor Henning Ueland <tor.henning@gmail.com> Date: Tue, 6 Jan 2015 22:04:36 +0100 Subject: [PATCH 1/4] Implemented db viewer for measured cell signal strength --- .../AIMSICD/adapters/AIMSICDDbAdapter.java | 7 ++- .../MeasuredCellStrengthCardData.java | 29 ++++++++++ .../MeasuredCellStrengthCardInflater.java | 53 +++++++++++++++++++ .../AIMSICD/fragments/DbViewerFragment.java | 36 ++++++++----- app/src/main/res/values/strings.xml | 1 + 5 files changed, 113 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java create mode 100644 app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java index a31814c3..556c558b 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java @@ -44,7 +44,7 @@ public class AIMSICDDbAdapter { private final String OPENCELLID_TABLE = "opencellid"; // DBe_import private final String DEFAULT_MCC_TABLE = "defaultlocation"; private final String SILENT_SMS_TABLE = "silentsms"; - private final String CELL_SIGNAL_TABLE = "cellSignal"; // ??? + private final String CELL_SIGNAL_TABLE = "cellSignal"; // cell tower signal strength collected by the device private final String DB_NAME = "aimsicd.db"; private final String[] mTables; @@ -53,6 +53,7 @@ public class AIMSICDDbAdapter { private final Context mContext; public static final int DATABASE_VERSION = 8; + private Cursor signalStrengthMeasurementDatA; public AIMSICDDbAdapter(Context context) { mContext = context; @@ -680,6 +681,10 @@ public class AIMSICDDbAdapter { return c.getInt(0); } + public Cursor getSignalStrengthMeasurementData() { + return mDb.rawQuery("SELECT cellID, signal, timestamp FROM " + CELL_SIGNAL_TABLE +" ORDER BY timestamp DESC", new String[0]); + } + /** * DbHelper class for the SQLite Database functions */ diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java new file mode 100644 index 00000000..3bceec41 --- /dev/null +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java @@ -0,0 +1,29 @@ +package com.SecUpwN.AIMSICD.adapters; + +import java.text.SimpleDateFormat; + +public class MeasuredCellStrengthCardData { + + private final long timestamp; + private final int signal; + private final int cellID; + private SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss"); + + public MeasuredCellStrengthCardData(int cellID, int signal, long timestamp) { + this.cellID = cellID; + this.signal = signal; + this.timestamp = timestamp; + } + + public String getCellID() { + return "Cell ID: "+cellID; + } + + public String getSignal() { + return"Signal Strength: "+signal+"DB"; + } + + public String getTimestamp() { + return "Recorded: "+formatter.format(timestamp); + } +} diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java new file mode 100644 index 00000000..2fcccc0d --- /dev/null +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java @@ -0,0 +1,53 @@ +package com.SecUpwN.AIMSICD.adapters; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.SecUpwN.AIMSICD.R; + +public class MeasuredCellStrengthCardInflater implements IAdapterViewInflater<MeasuredCellStrengthCardData> { + + @Override + public View inflate(final BaseInflaterAdapter<MeasuredCellStrengthCardData> adapter, final int pos, + View convertView, ViewGroup parent) { + ViewHolder holder; + + if (convertView == null) { + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + convertView = inflater.inflate(R.layout.silent_sms_items, parent, false); + holder = new ViewHolder(convertView); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + final MeasuredCellStrengthCardData item = adapter.getTItem(pos); + holder.updateDisplay(item); + + return convertView; + } + + private class ViewHolder { + + private final View mRootView; + private final TextView mAddress; + private final TextView mDisplayAddress; + private final TextView mMessageClass; + + public ViewHolder(View rootView) { + mRootView = rootView; + mAddress = (TextView) mRootView.findViewById(R.id.address); + mDisplayAddress = (TextView) mRootView.findViewById(R.id.display_address); + mMessageClass = (TextView) mRootView.findViewById(R.id.message_class); + + rootView.setTag(this); + } + + public void updateDisplay(MeasuredCellStrengthCardData item) { + mAddress.setText(item.getCellID()); + mDisplayAddress.setText(item.getSignal()); + mMessageClass.setText(item.getTimestamp()); + } + } +} diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java index 9a4ec223..b533486c 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java @@ -1,23 +1,11 @@ package com.SecUpwN.AIMSICD.fragments; -import com.SecUpwN.AIMSICD.R; -import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; -import com.SecUpwN.AIMSICD.adapters.BaseInflaterAdapter; -import com.SecUpwN.AIMSICD.adapters.CardItemData; -import com.SecUpwN.AIMSICD.adapters.CellCardInflater; -import com.SecUpwN.AIMSICD.adapters.DefaultLocationCardInflater; -import com.SecUpwN.AIMSICD.adapters.OpenCellIdCardInflater; -import com.SecUpwN.AIMSICD.adapters.SilentSmsCardData; -import com.SecUpwN.AIMSICD.adapters.SilentSmsCardInflater; -import com.SecUpwN.AIMSICD.utils.Helpers; - import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -26,6 +14,18 @@ import android.widget.Button; import android.widget.ListView; import android.widget.Spinner; +import com.SecUpwN.AIMSICD.R; +import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; +import com.SecUpwN.AIMSICD.adapters.BaseInflaterAdapter; +import com.SecUpwN.AIMSICD.adapters.CardItemData; +import com.SecUpwN.AIMSICD.adapters.CellCardInflater; +import com.SecUpwN.AIMSICD.adapters.DefaultLocationCardInflater; +import com.SecUpwN.AIMSICD.adapters.MeasuredCellStrengthCardData; +import com.SecUpwN.AIMSICD.adapters.MeasuredCellStrengthCardInflater; +import com.SecUpwN.AIMSICD.adapters.OpenCellIdCardInflater; +import com.SecUpwN.AIMSICD.adapters.SilentSmsCardData; +import com.SecUpwN.AIMSICD.adapters.SilentSmsCardInflater; + public class DbViewerFragment extends Fragment { private AIMSICDDbAdapter mDb; @@ -122,6 +122,8 @@ public class DbViewerFragment extends Fragment { case "Silent SMS": result = mDb.getSilentSmsData(); break; + case "Measured cell signal strengths": + result = mDb.getSignalStrengthMeasurementData(); } BaseInflaterAdapter adapter = null; @@ -215,6 +217,16 @@ public class DbViewerFragment extends Fragment { } return adapter; } + case "Measured cell signal strengths": { + BaseInflaterAdapter<MeasuredCellStrengthCardData> adapter + = new BaseInflaterAdapter<>( + new MeasuredCellStrengthCardInflater()); + while (tableData.moveToNext()) { + MeasuredCellStrengthCardData data = new MeasuredCellStrengthCardData(tableData.getInt(0), tableData.getInt(1), tableData.getLong(2)); + adapter.addItem(data, false); + } + return adapter; + } default: { BaseInflaterAdapter<CardItemData> adapter = new BaseInflaterAdapter<>( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e5aad08d..01e8bc18 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -203,6 +203,7 @@ <item>Imported OCID Data</item> <item>Default MCC Locations</item> <item>Silent SMS</item> + <item>Measured cell signal strengths</item> </string-array> <string name="database_export_successful">Export Successful</string> -- GitLab From 02a659ee3ab6ffe90ef251f26e4be4cda466e0c8 Mon Sep 17 00:00:00 2001 From: Tor Henning Ueland <tor.henning@gmail.com> Date: Tue, 6 Jan 2015 22:17:34 +0100 Subject: [PATCH 2/4] Better saving of timestamp for signal detection --- .../service/SignalStrengthTracker.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java index ce8183b5..582f2cf0 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java @@ -1,9 +1,6 @@ package com.SecUpwN.AIMSICD.service; import android.content.Context; -import android.hardware.Sensor; -import android.hardware.SensorEvent; -import android.hardware.SensorEventListener; import android.util.Log; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; @@ -24,13 +21,13 @@ public class SignalStrengthTracker { public static final String TAG = "SignalStrengthMonitor"; private static int sleepTimeBetweenSignalRegistration = 30; //seconds - private static int sleepTimeBetweenPersistation = 900; //seconds - private static int minimumIdleTime = 30; //seconds + private static int sleepTimeBetweenPersistation = 120; //seconds + private static int minimumIdleTime = 10; //seconds private static int maximumNumberOfDaysSaved = 60; //days private static int mysteriousSignalDifference = 10; //DB private HashMap<Integer, Long> lastRegistration = new HashMap<>(); - private HashMap<Integer, ArrayList<Integer>> toCalculate = new HashMap<>(); + private ArrayList<SignalResult> dataToPersist = new ArrayList<>(); private HashMap<Integer, Integer> averageSignalCache = new HashMap<>(); private long lastPersistTime = 0; private long lastMovementDetected = 0l; @@ -63,12 +60,10 @@ public class SignalStrengthTracker { if(lastRegistration.get(cellID) != null) { diff = now - lastRegistration.get(cellID); } - lastRegistration.put(cellID, now); - if(toCalculate.get(cellID) == null) { - toCalculate.put(cellID, new ArrayList<Integer>(1)); - } Log.i(TAG, "Scheduling signal strength calculation from cell #" + cellID + " @ " + signalStrength + "DB, last registration was "+diff+"ms ago"); - toCalculate.get(cellID).add(signalStrength); + lastRegistration.put(cellID, now); + SignalResult row = new SignalResult(cellID, signalStrength, now); + dataToPersist.add(row); lastRegistration.put(cellID, now); } @@ -85,13 +80,11 @@ public class SignalStrengthTracker { */ private void persistData() { mDbHelper.open(); - for(int cellID : toCalculate.keySet()) { - for(int signal : toCalculate.get(cellID)) { - mDbHelper.addSignalStrength(cellID, signal, lastRegistration.get(cellID)); - } + for(SignalResult sr : dataToPersist) { + mDbHelper.addSignalStrength(sr.cellID, sr.signal, sr.timestamp); } mDbHelper.close(); - toCalculate.clear(); + dataToPersist.clear(); } /* @@ -152,4 +145,16 @@ public class SignalStrengthTracker { //Log.d(TAG, "We are moving..."); lastMovementDetected = System.currentTimeMillis(); } + + private class SignalResult { + public int cellID; + public int signal; + public long timestamp; + + SignalResult(int cellID, int signal, long timestamp) { + this.cellID = cellID; + this.signal = signal; + this.timestamp = timestamp; + } + } } -- GitLab From 2f93c2fdba0c78464183f933cd0323dce0db7f39 Mon Sep 17 00:00:00 2001 From: Tor Henning Ueland <tor.henning@gmail.com> Date: Tue, 6 Jan 2015 22:21:18 +0100 Subject: [PATCH 3/4] Code documentation --- .../AIMSICD/adapters/MeasuredCellStrengthCardData.java | 7 ++++++- .../AIMSICD/adapters/MeasuredCellStrengthCardInflater.java | 7 ++++++- .../com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java index 3bceec41..02f53cad 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java @@ -1,7 +1,12 @@ package com.SecUpwN.AIMSICD.adapters; import java.text.SimpleDateFormat; - +/** + * + * Data card class used in DB viewer (for Measured cell strength measurements) + * + * @author Tor Henning Ueland + */ public class MeasuredCellStrengthCardData { private final long timestamp; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java index 2fcccc0d..8a89ce5a 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java @@ -6,7 +6,12 @@ import android.view.ViewGroup; import android.widget.TextView; import com.SecUpwN.AIMSICD.R; - +/** + * + * Inflater class used in DB viewer (for Measured cell strength measurements) + * + * @author Tor Henning Ueland + */ public class MeasuredCellStrengthCardInflater implements IAdapterViewInflater<MeasuredCellStrengthCardData> { @Override diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java index 582f2cf0..765297d5 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java @@ -146,6 +146,9 @@ public class SignalStrengthTracker { lastMovementDetected = System.currentTimeMillis(); } + /** + * Internal class only used here to keep a result object in hand for future persisting in DB + */ private class SignalResult { public int cellID; public int signal; -- GitLab From 1ea11d6ddba5e3b8511b1dc0c9cfc2ba85e1f013 Mon Sep 17 00:00:00 2001 From: Tor Henning Ueland <tor.henning@gmail.com> Date: Tue, 6 Jan 2015 22:25:46 +0100 Subject: [PATCH 4/4] Re-adjusted some levels for Signal Strength Tracker --- .../com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java index 765297d5..7c1bb7c3 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java @@ -20,9 +20,9 @@ import java.util.HashMap; public class SignalStrengthTracker { public static final String TAG = "SignalStrengthMonitor"; - private static int sleepTimeBetweenSignalRegistration = 30; //seconds - private static int sleepTimeBetweenPersistation = 120; //seconds - private static int minimumIdleTime = 10; //seconds + private static int sleepTimeBetweenSignalRegistration = 60; //seconds + private static int sleepTimeBetweenPersistation = 900; //seconds + private static int minimumIdleTime = 30; //seconds private static int maximumNumberOfDaysSaved = 60; //days private static int mysteriousSignalDifference = 10; //DB -- GitLab