From 8068cb37c5b5cd08763727fa88b4a16586860b4d Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Sat, 14 Nov 2015 20:45:39 +0100 Subject: [PATCH 01/82] Cleaned up SmsDetector.java implementation, related issues #615, #537 Merged with PR#619 proposal, fixed up looping, buffering, cleaned up names and calls, to be more clear in code --- .../AIMSICD/smsdetection/SmsDetector.java | 692 ++++++++---------- 1 file changed, 306 insertions(+), 386 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index 25f67f74e..3537e87d0 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -10,7 +10,6 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.content.SharedPreferences; import android.os.IBinder; import android.util.Log; @@ -19,99 +18,97 @@ import com.SecUpwN.AIMSICD.utils.Device; import com.SecUpwN.AIMSICD.utils.MiscUtils; -import java.io.DataInputStream; +import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.List; /** * Description: Detects mysterious SMS by scraping Logcat entries. - * - * + *

+ *

* NOTES: For this to work better Samsung users might have to set their Debug Level to High - * in SysDump menu *#9900# or *#*#9900#*#* - * - * This is by no means a complete detection method but gives us something to work off. - * - * For latest list of working phones/models, please see: - * https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/532 - * - * PHONE:Samsung S5 MODEL:SM-G900F ANDROID_VER:4.4.2 TYPE0:YES MWI:YES - * PHONE:Samsung S4-min MODEL:GT-I9195 ANDROID_VER:4.2.2 TYPE0:YES MWI:YES - * PHONE:Sony Xperia J MODEL:ST260i ANDROID_VER:4.1.2 TYPE0:NO MWI:YES - * + * in SysDump menu *#9900# or *#*#9900#*#* + *

+ * This is by no means a complete detection method but gives us something to work off. + *

+ * For latest list of working phones/models, please see: + * https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/532 + *

+ * PHONE:Samsung S5 MODEL:SM-G900F ANDROID_VER:4.4.2 TYPE0:YES MWI:YES + * PHONE:Samsung S4-min MODEL:GT-I9195 ANDROID_VER:4.2.2 TYPE0:YES MWI:YES + * PHONE:Sony Xperia J MODEL:ST260i ANDROID_VER:4.1.2 TYPE0:NO MWI:YES + *

* To Use: + *

+ * SmsDetector smsDetector = new SmsDetector(context); + *

+ * smsDetector.startSmsDetection(); + * smsDetector.stopSmsDetection(); + *

+ *

+ * TODO: + * [ ] Add more mTAG to the detection Log items * - * SmsDetector smsdetector = new SmsDetector(context); - * - * smsdetector.startSmsDetection(); - * smsdetector.stopSmsDetection(); - * - * - * TODO: - * [ ] Add more mTAG to the detection Log items - * - * - * @author: Paul Kinsella @banjaxbanjo + * @author Paul Kinsella @banjaxbanjo */ -public class SmsDetector extends Thread { +public final class SmsDetector extends Thread { private final static String TAG = "SmsDetector"; - private DataInputStream dis; - private DataOutputStream dos; - private AimsicdService mAimsicdService; - private SharedPreferences prefs; + private BufferedReader mLogcatReader; + private AimsicdService mAIMSICDService; private boolean mBound; - private AIMSICDDbAdapter dbacess; - private Context tContext; - private String[] SILENT_ONLY_TAGS; + private AIMSICDDbAdapter mDbAdapter; + private Context mContext; + private final String[] LOADED_DETECTION_STRINGS; + private static final int TYPE0 = 1, MWI = 2, WAP = 3; + // TODO: replace this with retrieval from AIMSICDDbAdapter + private static final int LOGCAT_BUFFER_MAX_SIZE = 100; /** - * Holds known values to get the senders number and sms data + * To correctly detect sms data and phone numbers on wap, we need at least + * 10 lines after line which indicates wap communication */ - private String DETECTION_PHONENUM_SMS_DATA[] = { - "SMS originating address:", - "SMS message body (raw):", - "OrigAddr"}; + private static final int LOGCAT_WAP_EXTRA_LINES = 10; private static boolean isRunning = false; - public SmsDetector(Context newcontext){ - tContext = newcontext; - dbacess = new AIMSICDDbAdapter(newcontext); + public SmsDetector(Context context) { + mContext = context; + mDbAdapter = new AIMSICDDbAdapter(context); + ArrayList silent_string = mDbAdapter.getDetectionStrings(); - ArrayList silent_string = dbacess.getDetectionStrings(); - - SILENT_ONLY_TAGS = new String[silent_string.size()]; - for(int x = 0; x logcatLines = new ArrayList<>(); while (getSmsDetectionState()) { try { - int bufferlen = dis.available(); + logcatLine = mLogcatReader.readLine(); + if (logcatLines.size() >= LOGCAT_BUFFER_MAX_SIZE || logcatLine != null) { + logcatLines.add(logcatLine); + } else if (logcatLines.size() == 0) { + /** + * Sleep only when there is no more input, not after going through buffer + * to not unnecessary slow down the process + * */ + Thread.sleep(1000); + } else { + /** + * In moment, where there are no data + * we check the current buffer and clear it + * */ + String[] outLines = new String[logcatLines.size()]; + logcatLines.toArray(outLines); + + for (int counter = 0; counter < logcatLines.size(); counter++) { + String bufferedLine = logcatLines.get(counter); + switch (checkForSms(bufferedLine)) { + case TYPE0: + parseTypeZeroSms(outLines, MiscUtils.logcatTimeStampParser(bufferedLine)); + break; + case MWI: + parseMwiSms(outLines, MiscUtils.logcatTimeStampParser(bufferedLine)); + break; + case WAP: + int remainingLinesInBuffer = logcatLines.size() - counter - LOGCAT_WAP_EXTRA_LINES; + if (remainingLinesInBuffer < 0) { + /** + * we need to go forward a few more lines to get data + * and store it in post buffer array + * */ + String[] wapPostLines = new String[Math.abs(remainingLinesInBuffer)]; + String extraLine; + for (int x = 0; x < Math.abs(remainingLinesInBuffer); x++) { + if ((extraLine = mLogcatReader.readLine()) != null) { + wapPostLines[x] = extraLine; + } + } - if (bufferlen != 0) { - byte[] b = new byte[bufferlen]; - dis.read(b); + /** + * We'll add the extra lines to logcat buffer, so we don't miss anything + * on detection cycle continue + * */ + int insertCounter = logcatLines.size(); + for (String postLine : wapPostLines) { + logcatLines.add(counter + insertCounter, postLine); + insertCounter++; + } + } - String split[] = new String(b).split("\n"); - checkForSilentSms(split); + /** + * Will readout from LogcatBuffer remaining lines, or next LOGCAT_WAP_EXTRA_LINES lines + * depending on how many are available + * */ + int availableLines = Math.min(logcatLines.size() - counter - LOGCAT_WAP_EXTRA_LINES, LOGCAT_WAP_EXTRA_LINES); + String[] nextAvailableLines = new String[availableLines]; + for (int nextLine = 0; nextLine < availableLines; nextLine++) { + nextAvailableLines[nextLine] = logcatLines.get(counter + nextLine); + } - } else { - Thread.sleep(1000); + parseWapPushSms(outLines, nextAvailableLines, MiscUtils.logcatTimeStampParser(bufferedLine)); + break; + } + counter++; + } + + logcatLines.clear(); } } catch (IOException e) { - Log.e(TAG, "IOE Stacktrace", e); + Log.e(TAG, "IO Exception", e); } catch (InterruptedException e) { - Log.e(TAG, "IE Exception", e); + Log.e(TAG, "Interrupted Exception", e); } } - } - - - public void checkForSilentSms(String[] progress){ - - for(int index = 0; index < SILENT_ONLY_TAGS.length; index++) { - - for(int x =0;x >>>" + SILENT_ONLY_TAGS[index].split("#")[1]); - - if(SILENT_ONLY_TAGS[index].split("#")[1].equals("TYPE0")) { - - CapturedSmsData setmsg = new CapturedSmsData(); - setmsg.setSenderNumber("unknown"); - setmsg.setSenderMsg("no data"); - - // Count backward to get the senders number (if any). The senders - // number is usually back about -15 in the array. - int newCount = x - 15; + try { + mLogcatReader.close(); + } catch (IOException ee) { + Log.e(TAG, "IOE Error closing BufferedReader", ee); + } + } - if(newCount > 0) { // Only check if array length is not -minus (if minus we can't count back so skip) - while (newCount < x) { // Loop through array and try find number and sms data if any - if (progress[newCount].contains(DETECTION_PHONENUM_SMS_DATA[2].toString())) { - try { - //Looking for OrigAddr this is where type0 sender number is - String number = progress[newCount].substring(progress[newCount].indexOf("OrigAddr")).replace(DETECTION_PHONENUM_SMS_DATA[2].toString(), "").trim(); - setmsg.setSenderNumber(number); - } catch (Exception ee) { - Log.e(TAG, "Error parsing number", ee); - } - }else if (progress[newCount].contains(DETECTION_PHONENUM_SMS_DATA[1].toString())) { - try { - String smsdata = progress[newCount].substring( - progress[newCount].indexOf("'") + 1, - progress[newCount].length() - 1); - - setmsg.setSenderMsg(smsdata); - } catch (Exception ee) { - Log.e(TAG, "Error parsing SMS data:\n"+ ee.toString(), ee); - } - } - newCount++; - } - } - setmsg.setSmsTimestamp(logcat_timestamp); - setmsg.setSmsType("TYPE0"); - setmsg.setCurrent_lac(mAimsicdService.getCellTracker().getMonitorCell().getLAC()); - setmsg.setCurrent_cid(mAimsicdService.getCellTracker().getMonitorCell().getCID()); - setmsg.setCurrent_nettype(Device.getNetworkTypeName(mAimsicdService.getCell().getNetType())); - int isRoaming = 0; - - if("true".equals(mAimsicdService.getCellTracker().getDevice().isRoaming())) { - isRoaming = 1; - } - setmsg.setCurrent_roam_status(isRoaming); - // TODO is this the right place to get upto date geo location? - setmsg.setCurrent_gps_lat(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()); - setmsg.setCurrent_gps_lon(mAimsicdService.lastKnownLocation().getLongitudeInDegrees()); - - // Only alert if the timestamp is not in the data base - if(!dbacess.isTimeStampInDB(logcat_timestamp)) { - dbacess.storeCapturedSms(setmsg); - /*dbacess.insertEventLog( - MiscUtils.getCurrentTimeStamp(), - mAimsicdService.getCellTracker().getMonitorCell().getLAC(), - mAimsicdService.getCellTracker().getMonitorCell().getCID(), - mAimsicdService.getCellTracker().getMonitorCell().getPSC(), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - (int)mAimsicdService.getCell().getAccuracy(), - 3, - "Detected Type-0 SMS" - );*/ - dbacess.toEventLog(3, "Detected Type-0 SMS"); - MiscUtils.startPopUpInfo(tContext, 6); - } else { - Log.d(TAG, "Detected Sms already logged"); - } - - - }else if("MWI".equals(SILENT_ONLY_TAGS[index].split("#")[1].trim())) { - Log.i(TAG, "MWI DETECTED"); - CapturedSmsData setmsg = new CapturedSmsData(); - setmsg.setSenderNumber("unknown"); - setmsg.setSenderMsg("no data"); - int newCount = x - 15; - - //only check if array length is not -minus - if(newCount > 0) { - while (newCount < x) { - if (progress[newCount].contains(DETECTION_PHONENUM_SMS_DATA[0].toString())) { - - // This first try usually has the number of the sender - // and second try is just there incase OrigAddr string shows. - try { - String number = progress[newCount].substring(progress[newCount].indexOf("+")); - setmsg.setSenderNumber(number); - } catch (Exception ee) { - Log.e(TAG, "Error parsing number", ee); - } - }else if (progress[newCount].contains(DETECTION_PHONENUM_SMS_DATA[2].toString())) { - try { - //Looking for OrigAddr this is where sender number is - String number = progress[newCount].substring(progress[newCount].indexOf("OrigAddr")).replace(DETECTION_PHONENUM_SMS_DATA[2].toString(), "").trim(); - setmsg.setSenderNumber(number); - } catch (Exception ee) { - Log.e(TAG, "Error parsing number:"+ ee.getMessage(), ee); - } - } else if (progress[newCount].contains(DETECTION_PHONENUM_SMS_DATA[1].toString())) { - try { - String smsData = progress[newCount].substring( - progress[newCount].indexOf("'") + 1, - progress[newCount].length() - 1); - - setmsg.setSenderMsg(smsData); - } catch (Exception ee) { - Log.e(TAG, "Error parsing SMS data" + ee.getMessage(), ee); - } - } - newCount++; - } - } - - setmsg.setSmsTimestamp(logcat_timestamp); - setmsg.setSmsType("MWI"); - setmsg.setCurrent_lac(mAimsicdService.getCellTracker().getMonitorCell().getLAC()); - setmsg.setCurrent_cid(mAimsicdService.getCellTracker().getMonitorCell().getCID()); - setmsg.setCurrent_nettype(Device.getNetworkTypeName(mAimsicdService.getCell().getNetType())); - int isRoaming = 0; - if("true".equals(mAimsicdService.getCellTracker().getDevice().isRoaming())) { - isRoaming = 1; - } - setmsg.setCurrent_roam_status(isRoaming); - //TODO is this the right place to get upto date geo location? - setmsg.setCurrent_gps_lat(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()); - setmsg.setCurrent_gps_lon(mAimsicdService.lastKnownLocation().getLongitudeInDegrees()); - - //only alert if timestamp is not in the data base - - if(!dbacess.isTimeStampInDB(logcat_timestamp)) { - dbacess.storeCapturedSms(setmsg); - - /*dbacess.insertEventLog( - MiscUtils.getCurrentTimeStamp(), - mAimsicdService.getCellTracker().getMonitorCell().getLAC(), - mAimsicdService.getCellTracker().getMonitorCell().getCID(), - mAimsicdService.getCellTracker().getMonitorCell().getPSC(), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - (int)mAimsicdService.getCell().getAccuracy(), - 3,//TODO what are the DF_ids? 1 = changing lac 2 = cell no in OCID 3 = detected sms? - "Detected MWI sms" - );*/ - dbacess.toEventLog(4,"Detected MWI SMS"); - MiscUtils.startPopUpInfo(tContext, 7); - } else { - Log.d(TAG, " Detected Sms already logged"); - } - - } else if("WAPPUSH".equals(SILENT_ONLY_TAGS[index].split("#")[1].trim())) { - /* - Wap Push in logcat shows no data only senders number - TODO: data is probably in db content://raw/1? - */ - CapturedSmsData setmsg = new CapturedSmsData(); - setmsg.setSenderNumber("unknown"); - setmsg.setSenderMsg("no data"); - - int startindex = x - 2; - int endindex = x + 3; - /* wap push port DestPort 0x0B84 - * its usually at this index of +3 in array * - * */ - //This is index on Samsungs is different for other phone makes - if (progress[x + 3].contains("DestPort 0x0B84")) { - Log.d(TAG, "WAPPUSH DETECTED"); - /* loop thru array to find number */ - if (endindex+3 <= progress.length) { - while (startindex < endindex) - { - if (progress[startindex].contains(DETECTION_PHONENUM_SMS_DATA[2].toString())) { - try { - // Looking for OrigAddr this is where sender number is - String number = progress[startindex].substring( - progress[startindex].indexOf("OrigAddr")).replace( - DETECTION_PHONENUM_SMS_DATA[2].toString(), "").trim(); - - setmsg.setSenderNumber(number); - break; - } catch (Exception ee) { - Log.e(TAG, "Error parsing number", ee); - } + private int checkForSms(String line) { + //0 - null 1 = TYPE0, 2 = MWI, 3 = WAPPUSH + for (String LOADED_DETECTION_STRING : LOADED_DETECTION_STRINGS) { + //looping through detection strings to see does logcat line match + // memory optimized and precaution for LOADED_DETECTION_STRING being not filled + String[] splitDetectionString = LOADED_DETECTION_STRING == null ? null : LOADED_DETECTION_STRING.split("#"); + if (splitDetectionString == null || splitDetectionString.length < 2 || splitDetectionString[0] == null || splitDetectionString[1] == null) { + Log.d(TAG, "Broken detection string: " + LOADED_DETECTION_STRING); + // skip broken detection string + continue; + } + if (line.contains(splitDetectionString[0])) { + if ("TYPE0".equalsIgnoreCase(splitDetectionString[1])) { + Log.i(TAG, "TYPE0 detected"); + return TYPE0; + } else if ("MWI".equalsIgnoreCase(splitDetectionString[1])) { + Log.i(TAG, "MWI detected"); + return MWI; + } else if ("WAPPUSH".equalsIgnoreCase(splitDetectionString[1])) { + Log.i(TAG, "WAPPUSH detected"); + return WAP; + } - } - startindex++; + } + // This is currently unused, but keeping as an example of possible data contents + // else if (line.contains("BroadcastReceiver action: android.provider.Telephony.SMS_RECEIVED")) { + // Log.i(TAG, "SMS found"); + // return 0; + // } + } + return 0; + } - } - } + private void parseTypeZeroSms(String[] bufferLines, String logcat_timestamp) { - setmsg.setSmsTimestamp(logcat_timestamp); - setmsg.setSmsType("WAPPUSH"); - setmsg.setCurrent_lac(mAimsicdService.getCellTracker().getMonitorCell().getLAC()); - setmsg.setCurrent_cid(mAimsicdService.getCellTracker().getMonitorCell().getCID()); - setmsg.setCurrent_nettype(Device.getNetworkTypeName(mAimsicdService.getCell().getNetType())); - int isRoaming = 0; - if("true".equals(mAimsicdService.getCellTracker().getDevice().isRoaming())){ - isRoaming = 1; - } - setmsg.setCurrent_roam_status(isRoaming); - //TODO is this the right place to get upto date geo location? - setmsg.setCurrent_gps_lat(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()); - setmsg.setCurrent_gps_lon(mAimsicdService.lastKnownLocation().getLongitudeInDegrees()); - - //only alert if timestamp is not in the data base - - if(!dbacess.isTimeStampInDB(logcat_timestamp)) { - dbacess.storeCapturedSms(setmsg); - - /*dbacess.insertEventLog( - MiscUtils.getCurrentTimeStamp(), - mAimsicdService.getCellTracker().getMonitorCell().getLAC(), - mAimsicdService.getCellTracker().getMonitorCell().getCID(), - mAimsicdService.getCellTracker().getMonitorCell().getPSC(), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - (int)mAimsicdService.getCell().getAccuracy(), - 3, - "Detected WAP PUSH sms" - );*/ - dbacess.toEventLog(5, "Detected WAP PUSH SMS"); - MiscUtils.startPopUpInfo(tContext, 8); - } else { - Log.d(TAG, "Detected Sms already logged"); - } + CapturedSmsData capturedSms = new CapturedSmsData(); + String smsText = findSmsData(bufferLines, null); + String num = findSmsNumber(bufferLines, null); - }// end of if contains("DestPort 0x0B84") - - //This is index on Samsung's is different for other phone makes - else if (progress[x-1].contains("SMS originating address:")) { - Log.i(TAG, "WAPPUSH DETECTED"); - /* loop thru array to find number */ - endindex = x+3; - startindex = x-3; - - if (endindex <= progress.length) { - while (startindex < endindex) - { - if (progress[startindex].contains("SMS originating address:")) { - try { - String number = progress[startindex].substring(progress[startindex].indexOf("+")); - setmsg.setSenderNumber(number); - } catch (Exception ee) { - Log.e(TAG, "Error parsing number "+ ee.toString()); - } + capturedSms.setSenderNumber(num == null ? "null" : num); + capturedSms.setSenderMsg(smsText == null ? "null" : num); + capturedSms.setSmsTimestamp(logcat_timestamp); + capturedSms.setSmsType("TYPE0"); + capturedSms.setCurrent_lac(mAIMSICDService.getCellTracker().getMonitorCell().getLAC()); + capturedSms.setCurrent_cid(mAIMSICDService.getCellTracker().getMonitorCell().getCID()); + capturedSms.setCurrent_nettype(Device.getNetworkTypeName(mAIMSICDService.getCell().getNetType())); + int isRoaming = 0; - } - if (progress[startindex].contains("SMS SC address:")) { - try { - String number = progress[startindex].substring(progress[startindex].indexOf("+")); - Log.d(TAG, "Detected msg smsc: " + number); - } catch (Exception ee) { - Log.e(TAG, "Error parsing smsc number: " + ee.toString()); - } + if ("true".equals(mAIMSICDService.getCellTracker().getDevice().isRoaming())) { + isRoaming = 1; + } + capturedSms.setCurrent_roam_status(isRoaming); + capturedSms.setCurrent_gps_lat(mAIMSICDService.lastKnownLocation().getLatitudeInDegrees()); + capturedSms.setCurrent_gps_lon(mAIMSICDService.lastKnownLocation().getLongitudeInDegrees()); + + // Only alert if the timestamp is not in the data base + if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { + mDbAdapter.storeCapturedSms(capturedSms); + mDbAdapter.toEventLog(3, "Detected Type-0 SMS"); + MiscUtils.startPopUpInfo(mContext, 6); + } else { + Log.d(TAG, "Detected Sms already logged"); + } - } - startindex++; + } - } - } + private void parseMwiSms(String[] logcatLines, String logcat_timestamp) { + + CapturedSmsData capturedSms = new CapturedSmsData(); + String smsText = findSmsData(logcatLines, null); + String num = findSmsNumber(logcatLines, null); + + capturedSms.setSenderNumber(num == null ? "null" : num); + capturedSms.setSenderMsg(smsText == null ? "null" : smsText); + capturedSms.setSmsTimestamp(logcat_timestamp); + capturedSms.setSmsType("MWI"); + capturedSms.setCurrent_lac(mAIMSICDService.getCellTracker().getMonitorCell().getLAC()); + capturedSms.setCurrent_cid(mAIMSICDService.getCellTracker().getMonitorCell().getCID()); + capturedSms.setCurrent_nettype(Device.getNetworkTypeName(mAIMSICDService.getCell().getNetType())); + int isRoaming = 0; + if ("true".equals(mAIMSICDService.getCellTracker().getDevice().isRoaming())) { + isRoaming = 1; + } + capturedSms.setCurrent_roam_status(isRoaming); + capturedSms.setCurrent_gps_lat(mAIMSICDService.lastKnownLocation().getLatitudeInDegrees()); + capturedSms.setCurrent_gps_lon(mAIMSICDService.lastKnownLocation().getLongitudeInDegrees()); + + //only alert if timestamp is not in the data base + if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { + mDbAdapter.storeCapturedSms(capturedSms); + mDbAdapter.toEventLog(4, "Detected MWI SMS"); + MiscUtils.startPopUpInfo(mContext, 7); + } else { + Log.d(TAG, " Detected Sms already logged"); + } + } - setmsg.setSmsTimestamp(logcat_timestamp); - setmsg.setSmsType("WAPPUSH"); - setmsg.setCurrent_lac(mAimsicdService.getCellTracker().getMonitorCell().getLAC()); - setmsg.setCurrent_cid(mAimsicdService.getCellTracker().getMonitorCell().getCID()); - setmsg.setCurrent_nettype(Device.getNetworkTypeName(mAimsicdService.getCell().getNetType())); - int isRoaming = 0; - if("true".equals(mAimsicdService.getCellTracker().getDevice().isRoaming())) { - isRoaming = 1; - } - setmsg.setCurrent_roam_status(isRoaming); - //TODO is this the right place to get upto date geo location? - setmsg.setCurrent_gps_lat(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()); - setmsg.setCurrent_gps_lon(mAimsicdService.lastKnownLocation().getLongitudeInDegrees()); - - //only alert if timestamp is not in the data base - if(!dbacess.isTimeStampInDB(logcat_timestamp)) { - dbacess.storeCapturedSms(setmsg); - - /*dbacess.insertEventLog( - MiscUtils.getCurrentTimeStamp(), - mAimsicdService.getCellTracker().getMonitorCell().getLAC(), - mAimsicdService.getCellTracker().getMonitorCell().getCID(), - mAimsicdService.getCellTracker().getMonitorCell().getPSC(), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - String.valueOf(mAimsicdService.lastKnownLocation().getLatitudeInDegrees()), - (int)mAimsicdService.getCell().getAccuracy(), - 3, - "Detected WAP PUSH sms" - );*/ - dbacess.toEventLog(6, "Detected WAP PUSH (2) SMS"); - MiscUtils.startPopUpInfo(tContext, 8); - } else { - Log.d(TAG, "Detected SMS already logged"); - } + private void parseWapPushSms(String[] logcatLines, String[] postWapMessageLines, String logcat_timestamp) { + CapturedSmsData capturedSms = new CapturedSmsData(); + String smsText = findSmsData(logcatLines, postWapMessageLines); + String num = findSmsNumber(logcatLines, postWapMessageLines); + + capturedSms.setSenderNumber(num == null ? "null" : num); + capturedSms.setSenderMsg(smsText == null ? "null" : smsText); + capturedSms.setSmsTimestamp(logcat_timestamp); + capturedSms.setSmsType("WAPPUSH"); + capturedSms.setCurrent_lac(mAIMSICDService.getCellTracker().getMonitorCell().getLAC()); + capturedSms.setCurrent_cid(mAIMSICDService.getCellTracker().getMonitorCell().getCID()); + capturedSms.setCurrent_nettype(Device.getNetworkTypeName(mAIMSICDService.getCell().getNetType())); + int isRoaming = 0; + if ("true".equals(mAIMSICDService.getCellTracker().getDevice().isRoaming())) { + isRoaming = 1; + } + capturedSms.setCurrent_roam_status(isRoaming); + capturedSms.setCurrent_gps_lat(mAIMSICDService.lastKnownLocation().getLatitudeInDegrees()); + capturedSms.setCurrent_gps_lon(mAIMSICDService.lastKnownLocation().getLongitudeInDegrees()); + + //only alert if timestamp is not in the data base + if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { + mDbAdapter.storeCapturedSms(capturedSms); + mDbAdapter.toEventLog(6, "Detected WAPPUSH SMS"); + MiscUtils.startPopUpInfo(mContext, 8); + } else { + Log.d(TAG, "Detected SMS already logged"); + } + } - }// end of if contains("SMS originating address:") + private String findSmsData(String[] preBuffer, String[] postBuffer) { + //check pre buffer for number and sms msg + if (preBuffer != null) { + for (String preBufferLine : preBuffer) { + if (preBufferLine != null) { + if (preBufferLine.contains("SMS message body (raw):") && preBufferLine.contains("'")) { + preBufferLine = preBufferLine.substring(preBufferLine.indexOf("'") + 1, + preBufferLine.length() - 1); + return preBufferLine; + } + } + } + //check post buffer for number and sms msg + if (postBuffer != null) { + for (int x = 0; x < postBuffer.length; x++) { + if (postBuffer[x] != null) { + String testLine = preBuffer[x]; + if (testLine.contains("SMS message body (raw):") && testLine.contains("'")) { + testLine = testLine.substring(testLine.indexOf("'") + 1, + testLine.length() - 1); + return testLine; } - break; + } + } + } + } + return null; + } + + private String findSmsNumber(String[] preBuffer, String[] postBuffer) { + //check pre buffer for number and sms msg + if (preBuffer != null) { + for (String preBufferLine : preBuffer) { + if (preBufferLine != null) { + if (preBufferLine.contains("SMS originating address:") && preBufferLine.contains("+")) { + return preBufferLine.substring(preBufferLine.indexOf("+")); + } else if (preBufferLine.contains("OrigAddr")) { + preBufferLine = preBufferLine.substring(preBufferLine.indexOf("OrigAddr")).replace("OrigAddr", "").trim(); + return preBufferLine; + } + } + } + } + //check post buffer for number and sms msg + if (postBuffer != null) { + for (String postBufferLine : postBuffer) { + if (postBufferLine != null) { + if (postBufferLine.contains("SMS originating address:") && postBufferLine.contains("+")) { + return postBufferLine.substring(postBufferLine.indexOf("+")); + } else if (postBufferLine.contains("OrigAddr")) { + postBufferLine = postBufferLine.substring(postBufferLine.indexOf("OrigAddr")).replace("OrigAddr", "").trim(); + return postBufferLine; } } } } + return null; } private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { - mAimsicdService = ((AimsicdService.AimscidBinder) service).getService(); + mAIMSICDService = ((AimsicdService.AimscidBinder) service).getService(); mBound = true; } From 75b6e40b45f3748e057989d96c15144eb906dfab Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Tue, 17 Nov 2015 19:01:03 +0100 Subject: [PATCH 02/82] Fixed StringIndexOutOfBoundsException, Closes #632 --- .../AIMSICD/activities/MapViewerOsmDroid.java | 196 +++++++++--------- 1 file changed, 95 insertions(+), 101 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java index 16b787a49..9447634e3 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java @@ -45,7 +45,6 @@ import com.SecUpwN.AIMSICD.utils.RequestTask; import com.SecUpwN.AIMSICD.utils.TinyDB; -import org.osmdroid.api.IProjection; import org.osmdroid.tileprovider.tilesource.TileSourceFactory; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; @@ -59,39 +58,38 @@ import java.util.List; /** - * Description: TODO: add details - * - * Variables: TODO: add a list of variables that can be tuned (Max/MinZoom factors etc) - * - * Current Issues: - * - * [x] Map is not immediately updated with the BTS info. It take a "long" time ( >10 seconds) - * before map is updated. Any way to shorten this? - * [ ] See: #272 #250 #228 - * [ ] Some pins remain clustered even on the greatest zoom, this is probably - * due to over sized icons, or too low zoom level. - * [x] pin icons are too big. We need to reduce pin dot diameter by ~50% - * [ ] Need a manual way to add GPS coordinates of current location (see code comments below) - * [ ] - * - * Notes: - * a) Latest OSM version can use MaxZoomLevel of 21, please see: - * https://github.com/osmdroid/osmdroid/issues/49 - * https://github.com/osmdroid/osmdroid/issues/81 - * https://code.google.com/p/osmbonuspack/issues/detail?id=102 - * - * ChangeLog: - * - * 2015-01-22 E:V:A Changed: setLocationUpdateMinTime: 60000 to 10000 ms - * setLocationUpdateMinDistance: 1000 to 100 meters - * 2015-02-12 E:V:A Added: mMap.setMaxZoomLevel(19); - * + * Description: TODO: add details + *

+ * Variables: TODO: add a list of variables that can be tuned (Max/MinZoom factors etc) + *

+ * Current Issues: + *

+ * [x] Map is not immediately updated with the BTS info. It take a "long" time ( >10 seconds) + * before map is updated. Any way to shorten this? + * [ ] See: #272 #250 #228 + * [ ] Some pins remain clustered even on the greatest zoom, this is probably + * due to over sized icons, or too low zoom level. + * [x] pin icons are too big. We need to reduce pin dot diameter by ~50% + * [ ] Need a manual way to add GPS coordinates of current location (see code comments below) + * [ ] + *

+ * Notes: + * a) Latest OSM version can use MaxZoomLevel of 21, please see: + * https://github.com/osmdroid/osmdroid/issues/49 + * https://github.com/osmdroid/osmdroid/issues/81 + * https://code.google.com/p/osmbonuspack/issues/detail?id=102 + *

+ * ChangeLog: + *

+ * 2015-01-22 E:V:A Changed: setLocationUpdateMinTime: 60000 to 10000 ms + * setLocationUpdateMinDistance: 1000 to 100 meters + * 2015-02-12 E:V:A Added: mMap.setMaxZoomLevel(19); */ -public class MapViewerOsmDroid extends BaseActivity implements OnSharedPreferenceChangeListener { +public final class MapViewerOsmDroid extends BaseActivity implements OnSharedPreferenceChangeListener { private final String TAG = "AIMSICD_MapViewer"; - public static final String updateOpenCellIDMarkers = "update_opencell_markers"; + public static final String updateOpenCellIDMarkers = "update_open_cell_markers"; private MapView mMap; private AIMSICDDbAdapter mDbHelper; @@ -104,7 +102,6 @@ public class MapViewerOsmDroid extends BaseActivity implements OnSharedPreferenc private MyLocationNewOverlay mMyLocationOverlay; private CompassOverlay mCompassOverlay; - private ScaleBarOverlay mScaleBarOverlay; private CellTowerGridMarkerClusterer mCellTowerGridMarkerClusterer; private Menu mOptionsMenu; TelephonyManager tm; @@ -134,7 +131,7 @@ public void onCreate(Bundle savedInstanceState) { setUpMapIfNeeded(); mDbHelper = new AIMSICDDbAdapter(mContext); - tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); + tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // Bind to LocalService Intent intent = new Intent(mContext, AimsicdService.class); @@ -209,7 +206,7 @@ protected void onPause() { @Override public void onReceive(Context context, Intent intent) { loadEntries(); - if(BuildConfig.DEBUG && mCellTowerGridMarkerClusterer != null && mCellTowerGridMarkerClusterer.getItems() != null) { + if (BuildConfig.DEBUG && mCellTowerGridMarkerClusterer != null && mCellTowerGridMarkerClusterer.getItems() != null) { Log.v(TAG, "mMessageReceiver CellTowerMarkers.invalidate() markers.size():" + mCellTowerGridMarkerClusterer.getItems().size()); } @@ -218,7 +215,7 @@ public void onReceive(Context context, Intent intent) { /** * Service Connection to bind the activity to the service - * + *

* This seem to setup the connection and animates the map window movement to the * last known location. */ @@ -276,12 +273,11 @@ private void setupMapType(int mapType) { /** * Description: Initialises the Map and sets initial options such as: - * Zoom levels and controls - * Compass - * ScaleBar - * Cluster Pin colors - * Location update settings - * + * Zoom levels and controls + * Compass + * ScaleBar + * Cluster Pin colors + * Location update settings */ private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. @@ -297,19 +293,19 @@ private void setUpMapIfNeeded() { mMap.getTileProvider().createTileCache(); mCompassOverlay = new CompassOverlay(this, new InternalCompassOrientationProvider(this), mMap); - mScaleBarOverlay = new ScaleBarOverlay(this); + ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(this); mScaleBarOverlay.setScaleBarOffset(getResources().getDisplayMetrics().widthPixels / 2, 10); mScaleBarOverlay.setCentred(true); // Sets cluster pin color mCellTowerGridMarkerClusterer = new CellTowerGridMarkerClusterer(MapViewerOsmDroid.this); - mCellTowerGridMarkerClusterer.setIcon(((BitmapDrawable)mContext.getResources(). - getDrawable(R.drawable.ic_map_pin_orange)).getBitmap()); + BitmapDrawable mapPinDrawable = (BitmapDrawable) mContext.getResources().getDrawable(R.drawable.ic_map_pin_orange); + mCellTowerGridMarkerClusterer.setIcon(mapPinDrawable == null ? null : mapPinDrawable.getBitmap()); - GpsMyLocationProvider imlp = new GpsMyLocationProvider(MapViewerOsmDroid.this.getBaseContext()); - imlp.setLocationUpdateMinDistance(100); // [m] // Set the minimum distance for location updates - imlp.setLocationUpdateMinTime(10000); // [ms] // Set the minimum time interval for location updates - mMyLocationOverlay = new MyLocationNewOverlay(MapViewerOsmDroid.this.getBaseContext(), imlp, mMap); + GpsMyLocationProvider gpsMyLocationProvider = new GpsMyLocationProvider(MapViewerOsmDroid.this.getBaseContext()); + gpsMyLocationProvider.setLocationUpdateMinDistance(100); // [m] // Set the minimum distance for location updates + gpsMyLocationProvider.setLocationUpdateMinTime(10000); // [ms] // Set the minimum time interval for location updates + mMyLocationOverlay = new MyLocationNewOverlay(MapViewerOsmDroid.this.getBaseContext(), gpsMyLocationProvider, mMap); mMyLocationOverlay.setDrawAccuracyEnabled(true); mMap.getOverlays().add(mCellTowerGridMarkerClusterer); @@ -349,7 +345,7 @@ public boolean onOptionsItemSelected(MenuItem item) { GeoLocation lastKnown = mAimsicdService.lastKnownLocation(); if (lastKnown != null) { Helpers.msgLong(mContext, - getString(R.string.contacting_opencellid_for_data)); + getString(R.string.contacting_opencellid_for_data)); Cell cell; cell = mAimsicdService.getCell(); cell.setLon(lastKnown.getLongitudeInDegrees()); @@ -372,7 +368,7 @@ public boolean onOptionsItemSelected(MenuItem item) { Helpers.getOpenCellData(mContext, cell, RequestTask.DBE_DOWNLOAD_REQUEST_FROM_MAP); } else { Helpers.msgLong(mContext, - getString(R.string.unable_to_determine_last_location)); + getString(R.string.unable_to_determine_last_location)); } return true; } @@ -382,17 +378,15 @@ public boolean onOptionsItemSelected(MenuItem item) { } /** - * Description: Loads Signal Strength Database details to plot on the map, - * only entries which have a location (lon, lat) are used. - * - * + * Description: Loads Signal Strength Database details to plot on the map, + * only entries which have a location (lon, lat) are used. */ private void loadEntries() { - new AsyncTask() { + new AsyncTask() { @Override protected GeoPoint doInBackground(Void... voids) { - int signal; + //int signal; mCellTowerGridMarkerClusterer.getItems().clear(); @@ -405,7 +399,7 @@ protected GeoPoint doInBackground(Void... voids) { try { // Grab cell data from CELL_TABLE (cellinfo) --> DBi_bts c = mDbHelper.getCellData(); - } catch(IllegalStateException ix) { + } catch (IllegalStateException ix) { Log.e(TAG, "Problem getting data from CELL_TABLE", ix); } @@ -420,15 +414,15 @@ protected GeoPoint doInBackground(Void... voids) { final int lac = c.getInt(c.getColumnIndex(DBTableColumnIds.DBI_BTS_LAC)); // LAC final int mcc = c.getInt(c.getColumnIndex(DBTableColumnIds.DBI_BTS_MCC)); // MCC final int mnc = c.getInt(c.getColumnIndex(DBTableColumnIds.DBI_BTS_MNC)); // MNC - final double dlat = c.getDouble(c.getColumnIndex(DBTableColumnIds.DBI_BTS_LAT)); // Lat - final double dlng = c.getDouble(c.getColumnIndex(DBTableColumnIds.DBI_BTS_LON)); // Lon + final double dLat = c.getDouble(c.getColumnIndex(DBTableColumnIds.DBI_BTS_LAT)); // Lat + final double dLng = c.getDouble(c.getColumnIndex(DBTableColumnIds.DBI_BTS_LON)); // Lon - if (Double.doubleToRawLongBits(dlat) == 0 - && Double.doubleToRawLongBits(dlng) == 0) { + if (Double.doubleToRawLongBits(dLat) == 0 + && Double.doubleToRawLongBits(dLng) == 0) { continue; } // TODO this (signal) is not in DBi_bts - signal = 1; + // signal = 1; //c.getInt(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_AVG_SIGNAL)); // signal // In case of missing or negative signal, set a default fake signal, // so that we can still draw signal circles. ? @@ -436,21 +430,21 @@ protected GeoPoint doInBackground(Void... voids) { // signal = 20; //} - if (Double.doubleToRawLongBits(dlat) != 0 - || Double.doubleToRawLongBits(dlng) != 0) { - loc = new GeoPoint(dlat, dlng); + if (Double.doubleToRawLongBits(dLat) != 0 + || Double.doubleToRawLongBits(dLng) != 0) { + loc = new GeoPoint(dLat, dLng); CellTowerMarker ovm = new CellTowerMarker(mContext, mMap, - "Cell ID: " + cellID, - "", loc, - new MarkerData( - String.valueOf(cellID), - String.valueOf(loc.getLatitude()), - String.valueOf(loc.getLongitude()), - String.valueOf(lac), - String.valueOf(mcc), - String.valueOf(mnc), - "", false) + "Cell ID: " + cellID, + "", loc, + new MarkerData( + String.valueOf(cellID), + String.valueOf(loc.getLatitude()), + String.valueOf(loc.getLongitude()), + String.valueOf(lac), + String.valueOf(mcc), + String.valueOf(mnc), + "", false) ); // The pin of our current position ovm.setIcon(getResources().getDrawable(R.drawable.ic_map_pin_blue)); @@ -468,7 +462,7 @@ public void run() { }); } - GeoPoint ret = new GeoPoint(0,0); + GeoPoint ret = new GeoPoint(0, 0); if (mBound) { try { int mcc = mAimsicdService.getCell().getMCC(); @@ -478,7 +472,7 @@ public void run() { Log.e("map", "Error getting default location!", e); } } - if(c != null) { + if (c != null) { c.close(); } // plot neighbouring cells @@ -495,7 +489,7 @@ public void run() { if (isCancelled()) return null; try { loc = new GeoPoint(cell.getLat(), cell.getLon()); - CellTowerMarker ovm = new CellTowerMarker(mContext,mMap, + CellTowerMarker ovm = new CellTowerMarker(mContext, mMap, getString(R.string.cell_id_label) + cell.getCID(), "", loc, new MarkerData( @@ -505,7 +499,7 @@ public void run() { String.valueOf(cell.getLAC()), String.valueOf(cell.getMCC()), String.valueOf(cell.getMNC()), - "", false)); + "", false)); // The pin of other BTS ovm.setIcon(getResources().getDrawable(R.drawable.ic_map_pin_orange)); @@ -526,12 +520,12 @@ public void run() { * b) WiFi location is not used * c) Default MCC is too far off * - * @param defaultLoc + * @param defaultLoc Default location to open map on */ @Override protected void onPostExecute(GeoPoint defaultLoc) { if (loc != null && (Double.doubleToRawLongBits(loc.getLatitude()) != 0 - && Double.doubleToRawLongBits(loc.getLongitude()) != 0)) { + && Double.doubleToRawLongBits(loc.getLongitude()) != 0)) { mMap.getController().setZoom(16); mMap.getController().animateTo(new GeoPoint(loc.getLatitude(), loc.getLongitude())); } else { @@ -553,8 +547,8 @@ protected void onPostExecute(GeoPoint defaultLoc) { } } } - if(mCellTowerGridMarkerClusterer != null) { - if(BuildConfig.DEBUG && mCellTowerGridMarkerClusterer.getItems() != null) { + if (mCellTowerGridMarkerClusterer != null) { + if (BuildConfig.DEBUG && mCellTowerGridMarkerClusterer.getItems() != null) { Log.v(TAG, "CellTowerMarkers.invalidate() markers.size():" + mCellTowerGridMarkerClusterer.getItems().size()); } //Drawing markers of cell tower immediately as possible @@ -568,17 +562,16 @@ private void loadOcidMarkersByNetwork() { // Check if OpenCellID data exists and if so load this now LinkedList items = new LinkedList<>(); String networkOperator = tm.getNetworkOperator(); - int imcc =0; - int imnc =0; - if (networkOperator != null) { - imcc = Integer.parseInt(networkOperator.substring(0, 3)); - imnc = Integer.parseInt(networkOperator.substring(3)); + int currentMmc = 0; + int currentMnc = 0; + if (networkOperator != null && networkOperator.length() > 3) { + currentMmc = Integer.parseInt(networkOperator.substring(0, 3)); + currentMnc = Integer.parseInt(networkOperator.substring(3)); } // DBe_import tower pins. Drawable cellTowerMarkerIcon = getResources().getDrawable(R.drawable.ic_map_pin_green); - IProjection p = mMap.getProjection(); - Cursor c = mDbHelper.returnOcidBtsByNetwork(imcc,imnc); + Cursor c = mDbHelper.returnOcidBtsByNetwork(currentMmc, currentMnc); if (c.moveToFirst()) { do { // CellID,Lac,Mcc,Mnc,Lat,Lng,AvgSigStr,Samples @@ -586,9 +579,9 @@ private void loadOcidMarkersByNetwork() { final int lac = c.getInt(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_LAC)); final int mcc = c.getInt(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_MCC)); final int mnc = c.getInt(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_MNC)); - final double dlat = Double.parseDouble(c.getString(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_GPS_LAT))); - final double dlng = Double.parseDouble(c.getString(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_GPS_LON))); - final GeoPoint location = new GeoPoint(dlat, dlng); + final double dLat = Double.parseDouble(c.getString(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_GPS_LAT))); + final double dLng = Double.parseDouble(c.getString(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_GPS_LON))); + final GeoPoint location = new GeoPoint(dLat, dLng); //where is c.getString(6)AvgSigStr final int samples = c.getInt(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_SAMPLES)); // Add map marker for CellID @@ -596,14 +589,14 @@ private void loadOcidMarkersByNetwork() { "Cell ID: " + cellID, "", location, new MarkerData( - String.valueOf(cellID), - String.valueOf(location.getLatitude()), - String.valueOf(location.getLongitude()), - String.valueOf(lac), - String.valueOf(mcc), - String.valueOf(mnc), - String.valueOf(samples), - false)); + String.valueOf(cellID), + String.valueOf(location.getLatitude()), + String.valueOf(location.getLongitude()), + String.valueOf(lac), + String.valueOf(mcc), + String.valueOf(mnc), + String.valueOf(samples), + false)); ovm.setIcon(cellTowerMarkerIcon); items.add(ovm); @@ -613,6 +606,7 @@ private void loadOcidMarkersByNetwork() { mCellTowerGridMarkerClusterer.addAll(items); } + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { final String KEY_MAP_TYPE = getBaseContext().getString(R.string.pref_map_type_key); if (key.equals(KEY_MAP_TYPE)) { @@ -644,7 +638,7 @@ public void onStop() { public void onStart() { super.onStart(); ((AppAIMSICD) getApplication()).attach(this); - if(TinyDB.getInstance().getBoolean(TinyDbKeys.FINISHED_LOAD_IN_MAP)) { + if (TinyDB.getInstance().getBoolean(TinyDbKeys.FINISHED_LOAD_IN_MAP)) { setRefreshActionButtonState(false); } } From 2f386b5e5929ebbb75a58661c282cb584d059784 Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Tue, 17 Nov 2015 20:29:31 +0100 Subject: [PATCH 03/82] Cleaned up AIMSICDDbAdapter implementation --- .../AIMSICD/adapters/AIMSICDDbAdapter.java | 1458 ++++++++--------- .../SecUpwN/AIMSICD/utils/CommandResult.java | 2 +- .../SecUpwN/AIMSICD/utils/RequestTask.java | 2 +- 3 files changed, 729 insertions(+), 733 deletions(-) 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 f7ed083c2..8b137f044 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java @@ -39,96 +39,94 @@ /** * Description: - * - * This class handle all the AMISICD DataBase maintenance operations, like - * creation, population, updates, backup, restore and various selections. - * - * - * + *

+ * This class handle all the AMISICD DataBase maintenance operations, like + * creation, population, updates, backup, restore and various selections. + *

+ *

+ *

* Current Issues: TODO - * - * [ ] We'd like to Export the entire DB (like a dump), so we need ... - * [x] Clarify the difference between cell.getCID() and CellID (see insertCell() below.) - * [ ] prepareOpenCellUploadData() this needs to be updated and re-coded - * [ ] all functions related to SignalStrengthTracker.java need to be updated - * [ ] cleanseCellTable() I think this is complete it's used in CellTracker.java - * not SignalStrengthTracker.java - * [ ] addSignalStrength( int cellID, int signal, String timestamp ) - * The timestamp is stored as String.valueOf(System.currentTimeMillis()); - * because the new db column for this is TEXT? - * [ ] getAverageSignalStrength() // rx_signal - * - * - * ChangeLog: - * - * 2015-01-22 E:V:A Started DBe_import migration - * 2015-01-23 E:V:A ~~changed silent sms column names~~ NOT! - * Added EventLog table - * 2015-07-16 E:V:A Post DB design migration cleanup, see special notes below and - * ref issue #214. - * - * - * - * Notes: - * - * ====== !! IMPORTANT !! ====================================================================== - * For damn good reasons, we should try to stay with mDb.rawQuery() and NOT with mDb.query(). - * In fact we should try to avoid the entire AOS SQLite API as much as possible, to keep our - * queries and SQL related clean, portable and neat. That's what most developers understand. - * - * See: - * [1] http://stackoverflow.com/questions/1122679/querying-and-working-with-cursors-in-sqlite-on-android - * [2] http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery%28java.lang.String,%20java.lang.String%5B%5D%29 - * =============================================================================================== - * - * + Some examples we can use: - * - * 1) "Proper" style: - * rawQuery("SELECT id, name FROM people WHERE name = ? AND id = ?", new String[] {"David", "2"}); - * - * 2) Hack style: (avoiding the use of "?") - * String q = "SELECT * FROM customer WHERE _id = " + customerDbId ; - * Cursor mCursor = mDb.rawQuery(q, null); - * - * 3) Info on execSQL(): - * Execute a single SQL statement that is NOT a SELECT or when passed with an argument a - * SELECT/INSERT/UPDATE/DELETE statement. Suggested use with: ALTER, CREATE or DROP. - * - * + A few words about DB "Cursors": - * http://developer.android.com/reference/android/database/Cursor.html - * http://stackoverflow.com/questions/3861558/what-are-the-benefits-of-using-database-cursor - * - * - * =============================================================================================== - * POST DB Overhaul Notes (by banjaxbanjo) - * =============================================================================================== - * - * [x] Database is now kept open and is only closeed on app exit (no need to .open/close ) - * ^^^ This is correct! DO NOT CHANGE THIS BEHAVIOUR EVER!! - * - * [x] Default Locations now preloaded in DB - * [x] BackupDB() is now working with all new tables - * [x] RestoreDB() is now working with all new tables - * [x] Download OCID is working with new DbeImport Table - * [x] EventLog has been updated - * [x] insertBTS/insertBtsMeasure replaces insertCell/insertLocation - * [x] insertDBeImport replaces insertOpenCell - * [x] insertEventLog replaces insertDetection - * [x] returnEventLogData() replaces getEventLogData() - * [x] returnSmsData( replaces getSilentSmsData() - * [x] returnDBiBts() replaces getCellData() - * [x] returnDBiMeasure() replaces getLocationData() - * [x] returnDBeImport() replaces getOpenCellIDData() - * [x] "updateOpenCellID" renamed to "populateDBe_import" - * [x] removed populateDefaultMCC() as now these are preloaded - * [x] restoreDB()/backupDB() now restores/backup with new tables - * [x] removed: public class DbHelper extends SQLiteOpenHelper as we are now going with pre populated DB - * [x] A lot of code refactored to suit new DB changes - * + *

+ * [ ] We'd like to Export the entire DB (like a dump), so we need ... + * [x] Clarify the difference between cell.getCID() and CellID (see insertCell() below.) + * [ ] prepareOpenCellUploadData() this needs to be updated and re-coded + * [ ] all functions related to SignalStrengthTracker.java need to be updated + * [ ] cleanseCellTable() I think this is complete it's used in CellTracker.java + * not SignalStrengthTracker.java + * [ ] addSignalStrength( int cellID, int signal, String timestamp ) + * The timestamp is stored as String.valueOf(System.currentTimeMillis()); + * because the new db column for this is TEXT? + * [ ] getAverageSignalStrength() // rx_signal + *

+ *

+ * ChangeLog: + *

+ * 2015-01-22 E:V:A Started DBe_import migration + * 2015-01-23 E:V:A ~~changed silent sms column names~~ NOT! + * Added EventLog table + * 2015-07-16 E:V:A Post DB design migration cleanup, see special notes below and + * ref issue #214. + *

+ *

+ *

+ * Notes: + *

+ * ====== !! IMPORTANT !! ====================================================================== + * For damn good reasons, we should try to stay with mDb.rawQuery() and NOT with mDb.query(). + * In fact we should try to avoid the entire AOS SQLite API as much as possible, to keep our + * queries and SQL related clean, portable and neat. That's what most developers understand. + *

+ * See: + * [1] http://stackoverflow.com/questions/1122679/querying-and-working-with-cursors-in-sqlite-on-android + * [2] http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery%28java.lang.String,%20java.lang.String%5B%5D%29 + * =============================================================================================== + *

+ * + Some examples we can use: + *

+ * 1) "Proper" style: + * rawQuery("SELECT id, name FROM people WHERE name = ? AND id = ?", new String[] {"David", "2"}); + *

+ * 2) Hack style: (avoiding the use of "?") + * String q = "SELECT * FROM customer WHERE _id = " + customerDbId ; + * Cursor mCursor = mDb.rawQuery(q, null); + *

+ * 3) Info on execSQL(): + * Execute a single SQL statement that is NOT a SELECT or when passed with an argument a + * SELECT/INSERT/UPDATE/DELETE statement. Suggested use with: ALTER, CREATE or DROP. + *

+ * + A few words about DB "Cursors": + * http://developer.android.com/reference/android/database/Cursor.html + * http://stackoverflow.com/questions/3861558/what-are-the-benefits-of-using-database-cursor + *

+ *

+ * =============================================================================================== + * POST DB Overhaul Notes (by banjaxbanjo) + * =============================================================================================== + *

+ * [x] Database is now kept open and is only closed on app exit (no need to .open/close ) + * ^^^ This is correct! DO NOT CHANGE THIS BEHAVIOUR EVER!! + *

+ * [x] Default Locations now preloaded in DB + * [x] BackupDB() is now working with all new tables + * [x] RestoreDB() is now working with all new tables + * [x] Download OCID is working with new DbeImport Table + * [x] EventLog has been updated + * [x] insertBTS/insertBtsMeasure replaces insertCell/insertLocation + * [x] insertDBeImport replaces insertOpenCell + * [x] insertEventLog replaces insertDetection + * [x] returnEventLogData() replaces getEventLogData() + * [x] returnSmsData( replaces getSilentSmsData() + * [x] returnDBiBts() replaces getCellData() + * [x] returnDBiMeasure() replaces getLocationData() + * [x] returnDBeImport() replaces getOpenCellIDData() + * [x] "updateOpenCellID" renamed to "populateDBe_import" + * [x] removed populateDefaultMCC() as now these are preloaded + * [x] restoreDB()/backupDB() now restores/backup with new tables + * [x] removed: public class DbHelper extends SQLiteOpenHelper as we are now going with pre populated DB + * [x] A lot of code refactored to suit new DB changes */ -public class AIMSICDDbAdapter extends SQLiteOpenHelper{ +public final class AIMSICDDbAdapter extends SQLiteOpenHelper { - public static String FOLDER; public static final int DATABASE_VERSION = 1; // Is this "pragma user_version;" ? // TODO: This should be implemented as a SharedPreference... @@ -136,19 +134,20 @@ public class AIMSICDDbAdapter extends SQLiteOpenHelper{ private static final String TAG = "AIMSICDDbAdapter"; private static final String DB_NAME = "aimsicd.db"; - private static final String DB_PATH = "/data/data/com.SecUpwN.AIMSICD/databases/"; - private static final String DB_LOCATION = DB_PATH + DB_NAME; private String[] mTables; private SQLiteDatabase mDb; private Context mContext; private SharedPreferences mPreferences; + public static String mDatabasePath; + public static String mExternalFilesDirPath; public AIMSICDDbAdapter(Context context) { super(context, DB_NAME, null, 1); mContext = context; mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); - FOLDER = mContext.getExternalFilesDir(null) + File.separator; + mDatabasePath = mContext.getDatabasePath(DB_NAME).getAbsolutePath(); + mExternalFilesDirPath = mContext.getExternalFilesDir(null) + File.separator; //e.g. /storage/emulated/0/Android/data/com.SecUpwN.AIMSICD/ // Create a new blank DB then write pre-compiled DB in assets folder to blank DB. @@ -156,7 +155,7 @@ public AIMSICDDbAdapter(Context context) { createDataBase(); //return writable database - mDb = SQLiteDatabase.openDatabase(DB_LOCATION, null, SQLiteDatabase.OPEN_READWRITE); + mDb = SQLiteDatabase.openDatabase(mDatabasePath, null, SQLiteDatabase.OPEN_READWRITE); // This will return the database as open so we don't need to use .open . Then when app // is exiting we use new AIMSICDDbAdapter(getApplicationContext()).close(); to close it @@ -165,7 +164,7 @@ public AIMSICDDbAdapter(Context context) { // I am trying to keep in same order and aimsicd.sql script // Only backing up useful tables, uncomment if you want to backup - DBTableColumnIds.DEFAULT_LOCATION_TABLE_NAME, // defaultlocation: Default MCC for each country + DBTableColumnIds.DEFAULT_LOCATION_TABLE_NAME, // defaultLocation: Default MCC for each country //DBTableColumnIds.API_KEYS_TABLE_NAME, // API_keys: API keys for OpenCellID, MLS etc. //DBTableColumnIds.COUNTER_MEASURES_TABLE_NAME, // CounterMeasures: Counter Measures thresholds and description //DBTableColumnIds.DBE_CAPABILITIES_TABLE_NAME, // DBe_capabilities: External: MNO & BTS network capabilities @@ -182,16 +181,15 @@ public AIMSICDDbAdapter(Context context) { /** * Description: Creates an empty SQLite Database file on the system and rewrites it with - * our own pre-fabricated AIMSICD.db. - * + * our own pre-fabricated AIMSICD.db. + *

* NOTES: This is a modified version to suit of needs of this guys great guide on - * how to build a pre compiled db for android. Cheers Juan-Manuel Fluxà - * See: - * http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ - * + * how to build a pre compiled db for android. Cheers Juan-Manuel Fluxà + * See: + * http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ **/ public boolean createDataBase() { - if(!checkDataBase()) { + if (!checkDataBase()) { // By calling this method, an empty database will be created into the default system path // of your application so that we can overwrite that database with our own database. this.getReadableDatabase(); @@ -210,6 +208,7 @@ public boolean createDataBase() { /** * Check if the database already exist to avoid re-copying the file each time you open the application. + * * @return true if it exists, false if it doesn't */ private boolean checkDataBase() { @@ -217,13 +216,13 @@ private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { - Log.i(TAG, "Checking for db first install this will throw an error on install and is noraml"); - checkDB = SQLiteDatabase.openDatabase(DB_LOCATION, null, SQLiteDatabase.OPEN_READONLY); - } catch(SQLiteException e) { + Log.i(TAG, "Checking for db first install this will throw an error on install and is normal"); + checkDB = SQLiteDatabase.openDatabase(mDatabasePath, null, SQLiteDatabase.OPEN_READONLY); + } catch (SQLiteException e) { Log.e(TAG, "database not yet created", e); } - if(checkDB != null) { + if (checkDB != null) { checkDB.close(); return true; } @@ -232,16 +231,16 @@ private boolean checkDataBase() { /** * Description: Copies your database from your local assets-folder to the just created - * empty database in the system folder, from where it can be accessed and handled. - * This is done by transferring bytestream. + * empty database in the system folder, from where it can be accessed and handled. + * This is done by transferring byte stream. */ - private void copyDataBase() throws IOException{ + private void copyDataBase() throws IOException { // Open your local DB as the input stream InputStream myInput = mContext.getAssets().open(DB_NAME); // Open the empty DB as the output stream - OutputStream myOutput = new FileOutputStream(DB_LOCATION); + OutputStream myOutput = new FileOutputStream(mDatabasePath); - // Transfer bytes from the inputfile to the outputfile + // Transfer bytes from the input file to the output file byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { @@ -266,11 +265,12 @@ public void close() { public void onCreate(SQLiteDatabase sqLiteDatabase) { // To use foreign keys in SQLite we use: //db.execSQL("PRAGMA foreign_keys = ON;"); - // But this is already created inside SQL sript!! + // But this is already created inside SQL script!! } @Override - public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {} + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { + } // ==================================================================== @@ -279,14 +279,12 @@ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {} /** * Description: This is used in the AIMSICD framework Tests to delete cells. - * see: ../src/androidTest/java/com.SecUpwN.test/. - * + * see: ../src/androidTest/java/com.SecUpwN.test/. + *

* Issues: TODO: See comments below! * - * @param cellId This method deletes a cell with CID from CELL_TABLE - * + * @param cellId This method deletes a cell with CID from CELL_TABLE * @return result of deleting that CID - * */ public int deleteCell(int cellId) { Log.i(TAG, "Deleted CID: " + cellId); @@ -325,8 +323,8 @@ public int deleteCell(int cellId) { /** * Description: Returns Cell Information (DBi_bts) database contents - * this returns BTS's that we logged and is called from - * MapViewerOsmDroid.java to display cells on map + * this returns BTSs that we logged and is called from + * MapViewerOsmDroid.java to display cells on map */ public Cursor getCellData() { return returnDBiBts(); @@ -334,12 +332,11 @@ public Cursor getCellData() { /** * Description: Returns Cell Information for contribution to the OpenCellID project - * + *

* Function: Return a list of all rows from the DBi_measure table - * where isSubmitted is not 1. - * + * where isSubmitted is not 1. + *

* Dependencies: - * */ public Cursor getOCIDSubmitData() { @@ -361,32 +358,30 @@ public Cursor getOCIDSubmitData() { // ==================================================================== /** - * Description: This take a "Cell" bundle (from API) as input and uses its CID to check - * in the DBi_measure (?) if there is already an associated LAC. It then - * compares the API LAC to that of the DBi_Measure LAC. - * - * Issues: [ ] We should make all detections outside of AIMSICDDbAdapter.java in a - * separate module as described in the diagram in GH issue #215. - * https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/215 - * where it is referred to as "Detection Module" (DET)... - * - * [ ] Seem we're querying too much, when we only need items: 1,3,4,8,11 - * (Try to avoid over query to improve performance.) - * - * [ ] V V V V - * - * This is using the LAC found by API and comparing to LAC found from a previous - * measurement in the "DBi_measure". This is NOT depending on "DBe_import". - * This works for now...but we probably should consider populating "DBi_measure" - * as soon as the API gets a new LAC. Then the detection can be done by SQL, - * and by just comparing last 2 LAC entries for same CID. - * - * + * Description: This take a "Cell" bundle (from API) as input and uses its CID to check + * in the DBi_measure (?) if there is already an associated LAC. It then + * compares the API LAC to that of the DBi_Measure LAC. + *

+ * Issues: [ ] We should make all detections outside of AIMSICDDbAdapter.java in a + * separate module as described in the diagram in GH issue #215. + * https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/215 + * where it is referred to as "Detection Module" (DET)... + *

+ * [ ] Seem we're querying too much, when we only need items: 1,3,4,8,11 + * (Try to avoid over query to improve performance.) + *

+ * [ ] V V V V + *

+ * This is using the LAC found by API and comparing to LAC found from a previous + * measurement in the "DBi_measure". This is NOT depending on "DBe_import". + * This works for now...but we probably should consider populating "DBi_measure" + * as soon as the API gets a new LAC. Then the detection can be done by SQL, + * and by just comparing last 2 LAC entries for same CID. */ public boolean checkLAC(Cell cell) { - String query = String.format("SELECT * FROM DBi_bts WHERE CID = %d",cell.getCID()); //CID + String query = String.format("SELECT * FROM DBi_bts WHERE CID = %d", cell.getCID()); //CID - Cursor bts_cursor = mDb.rawQuery(query,null); + Cursor bts_cursor = mDb.rawQuery(query, null); while (bts_cursor.moveToNext()) { // 1=LAC, 8=Accuracy, 11=Time @@ -410,26 +405,25 @@ public boolean checkLAC(Cell cell) { /** * Description: UPDATE DBi_measure to indicate if OpenCellID DB contribution has been made - * */ public void ocidProcessed() { ContentValues ocidValues = new ContentValues(); ocidValues.put("isSubmitted", 1); // isSubmitted // TODO: rewrite mDb.query to use mDb.rawQuery ?? - // Perhaps: "UPDATE DBi_measure VALUES isSUbmitted=1 WHERE isSubmitted<>1;" ??? + // Perhaps: "UPDATE DBi_measure VALUES isSubmitted=1 WHERE isSubmitted<>1;" ??? mDb.update("DBi_measure", ocidValues, "isSubmitted<>?", new String[]{"1"}); // isSubmitted } /** * Description: This returns all BTS in the DBe_import by current sim card network - * rather than returning other bts from different networks and slowing - * down map view - * + * rather than returning other bts from different networks and slowing + * down map view + *

* Note: TODO: This might be unnecessary as the DBe_import should only use MCC/MNC - * as currently used by SIM service provider + * as currently used by SIM service provider */ - public Cursor returnOcidBtsByNetwork(int mcc,int mnc){ + public Cursor returnOcidBtsByNetwork(int mcc, int mnc) { String query = String.format( "SELECT * FROM DBe_import WHERE MCC = %d AND MNC = %d", mcc, mnc); return mDb.rawQuery(query, null); @@ -449,24 +443,25 @@ public double[] getDefaultLocation(int mcc) { loc[0] = 0.0; loc[1] = 0.0; } - cursor.close(); + if (cursor != null) { + cursor.close(); + } return loc; } /** * Description: Remove all but the last row, unless its CID is invalid... - * + *

* Dependencies: CellTracker.java: ( dbHelper.cleanseCellTable(); ) - * + *

* Issues: [ ] This will not work if: PRAGMA foreign_key=ON, then we need to delete - * the corresponding DBi_measure entries before / as well. - * - * [ ] TODO: It is UNCLEAR why this is needed!! It's probably an artifact of old DB tables?? - * TODO: Consider changing or removing! - * + * the corresponding DBi_measure entries before / as well. + *

+ * [ ] TODO: It is UNCLEAR why this is needed!! It's probably an artifact of old DB tables?? + * TODO: Consider changing or removing! + *

* Notes: Do we need to clean LAC as well? (Test with airplane-mode or roaming) - * - probably not since a APM would give both LAC and CID as "-1". - * + * - probably not since a APM would give both LAC and CID as "-1". */ public void cleanseCellTable() { // This removes all but the last row in the "DBi_bts" table @@ -483,29 +478,28 @@ public void cleanseCellTable() { /** * Description: Prepares the CSV file used to upload new data to the OCID server. - * + *

* Issues: TODO: - * [ ] Add "act" in upload data for the DBi_measure:RAT - * [ ] function getOCIDSubmitData() is not fully working ==> DB join not yet implemented - * [ ] skip (or change) progress bar, since CSV write is too fast to be seen. - * + * [ ] Add "act" in upload data for the DBi_measure:RAT + * [ ] function getOCIDSubmitData() is not fully working ==> DB join not yet implemented + * [ ] skip (or change) progress bar, since CSV write is too fast to be seen. + *

* Note: Q: Where is this file? - * A: It is wherever your device has mounted its SDCard. - * For example, in: /data/media/0/AIMSICD/OpenCellID - * - * OCID CSV upload format: - * "cellid" = CID (in UMTS long format) - * "measured_at" = time - * "rating" = gpsd_accu - * "act" = RAT (TEXT): - * 1xRTT, CDMA, eHRPD, IS95A, IS95B, EVDO_0, EVDO_A, EVDO_B, - * UMTS, HSPA+, HSDPA, HSUPA, HSPA, LTE, EDGE, GPRS, GSM - * + * A: It is wherever your device has mounted its SDCard. + * For example, in: /data/media/0/AIMSICD/OpenCellID + *

+ * OCID CSV upload format: + * "cellid" = CID (in UMTS long format) + * "measured_at" = time + * "rating" = gpsd_accu + * "act" = RAT (TEXT): + * 1xRTT, CDMA, eHRPD, IS95A, IS95B, EVDO_0, EVDO_A, EVDO_B, + * UMTS, HSPA+, HSDPA, HSUPA, HSPA, LTE, EDGE, GPRS, GSM */ public boolean prepareOpenCellUploadData() { boolean result; - File dir = new File(FOLDER + "OpenCellID/"); + File dir = new File(mExternalFilesDirPath + "OpenCellID/"); if (!dir.exists()) { result = dir.mkdirs(); if (!result) { @@ -518,7 +512,7 @@ public boolean prepareOpenCellUploadData() { // Get data not yet submitted: Cursor c = getOCIDSubmitData(); // Check if we have something to upload: - if(c.getCount() > 0) { + if (c.getCount() > 0) { if (!file.exists()) { result = file.createNewFile(); if (!result) { @@ -563,63 +557,63 @@ public boolean prepareOpenCellUploadData() { /** - * Description: Parses the downloaded CSV from OpenCellID and uses it to populate - * "DBe_import" table. - * - * - * Dependency: RequestTask.java :: onPostExecute() - * insertDBeImport() - * Issues: - * - * [ ] Progress bar is not shown or is the operation too quick to be seen? - * [ ] Why are we only populating 8 items out of 19? - * From downloaded OCID CSV file: (19 items) - * - * NOTES: - * - * a) We do not include "rej_cause" in backups. set to 0 as default - * b) Unfortunately there are 2 important missing items in the OCID CSV file: - * - "time_first" - * - "time_last" - * c) In addition the OCID data often contain unexplained negative values for one or both of: - * - "samples" - * - "range" - * - * d) The difference between "Cellid" and "cid", is that "cellid" is the "Long CID", - * consisting of RNC and a multiplier: - * Long CID = 65536 * RNC + CID - * See FAQ. - * + * Description: Parses the downloaded CSV from OpenCellID and uses it to populate + * "DBe_import" table. + *

+ *

+ * Dependency: RequestTask.java :: onPostExecute() + * insertDBeImport() + * Issues: + *

+ * [ ] Progress bar is not shown or is the operation too quick to be seen? + * [ ] Why are we only populating 8 items out of 19? + * From downloaded OCID CSV file: (19 items) + *

+ * NOTES: + *

+ * a) We do not include "rej_cause" in backups. set to 0 as default + * b) Unfortunately there are 2 important missing items in the OCID CSV file: + * - "time_first" + * - "time_last" + * c) In addition the OCID data often contain unexplained negative values for one or both of: + * - "samples" + * - "range" + *

+ * d) The difference between "Cellid" and "cid", is that "cellid" is the "Long CID", + * consisting of RNC and a multiplier: + * Long CID = 65536 * RNC + CID + * See FAQ. + *

* ======================================================================== * For details on available OpenCellID API DB values, see: * http://wiki.opencellid.org/wiki/API * http://wiki.opencellid.org/wiki/FAQ#Long_CellID_vs._short_Cell_ID * ======================================================================== - * # head -2 opencellid.csv - * lat,lon,mcc,mnc,lac,cellid,averageSignalStrength,range,samples,changeable,radio,rnc,cid,psc,tac,pci,sid,nid,bid - * - * 0 lat TEXT - * 1 lon TEXT - * 2 mcc INTEGER - * 3 mnc INTEGER - * 4 lac INTEGER - * 5 cellid INTEGER (Long CID) = 65536 * RNC + CID - * 6 averageSignalStrength INTEGER (rx_power) - * 7 range INTEGER (accu) - * 8 samples INTEGER - * 9 changeable INTEGER (isGPSexact) - * 10 radio TEXT (RAT) - * 11 rnc INTEGER - * 12 cid INTEGER CID (Short)= "Long CID" mod 65536 - * 13 psc INTEGER - * --------- vvv See OCID API vvv --------- - * 14 tac - - * 15 pci - - * 16 sid - - * 17 nid - - * 18 bid - - * - * 54.63376,25.160243,246,3,20,1294,0,-1,1,1,GSM,,,,,,,, + * # head -2 opencellid.csv + * lat,lon,mcc,mnc,lac,cellid,averageSignalStrength,range,samples,changeable,radio,rnc,cid,psc,tac,pci,sid,nid,bid + *

+ * 0 lat TEXT + * 1 lon TEXT + * 2 mcc INTEGER + * 3 mnc INTEGER + * 4 lac INTEGER + * 5 cellid INTEGER (Long CID) = 65536 * RNC + CID + * 6 averageSignalStrength INTEGER (rx_power) + * 7 range INTEGER (accu) + * 8 samples INTEGER + * 9 changeable INTEGER (isGPSexact) + * 10 radio TEXT (RAT) + * 11 rnc INTEGER + * 12 cid INTEGER CID (Short)= "Long CID" mod 65536 + * 13 psc INTEGER + * --------- vvv See OCID API vvv --------- + * 14 tac - + * 15 pci - + * 16 sid - + * 17 nid - + * 18 bid - + *

+ * 54.63376,25.160243,246,3,20,1294,0,-1,1,1,GSM,,,,,,,, * ======================================================================== */ public boolean populateDBeImport() { @@ -648,15 +642,15 @@ public boolean populateDBeImport() { if (!csvCellID.isEmpty()) { int lines = csvCellID.size(); - Log.i(TAG, "UpdateOpenCellID: OCID CSV size (lines): " + lines ); + Log.i(TAG, "UpdateOpenCellID: OCID CSV size (lines): " + lines); // TODO: WHAT IS THIS DOING?? (Why is it needed?) // This counts how many CIDs we have in DBe_import Cursor lCursor = mDb.rawQuery("SELECT CID, COUNT(CID) FROM DBe_import GROUP BY CID", null); SparseArray lPresentCellID = new SparseArray<>(); - if(lCursor.getCount() > 0) { - while(lCursor.moveToNext()) { - lPresentCellID.put(lCursor.getInt(0), true ); + if (lCursor.getCount() > 0) { + while (lCursor.moveToNext()) { + lPresentCellID.put(lCursor.getInt(0), true); } } lCursor.close(); @@ -669,12 +663,12 @@ public boolean populateDBeImport() { // TODO: IS this needed!??? // Inserted into the table only unique values CID // without opening additional redundant cursor before each insert. - if(lPresentCellID.get(Integer.parseInt(csvCellID.get(rowCounter)[5]), false)) { + if (lPresentCellID.get(Integer.parseInt(csvCellID.get(rowCounter)[5]), false)) { continue; } // Insert details into OpenCellID Database using: insertDBeImport() // Beware of negative values of "range" and "samples"!! - String lat = csvCellID.get(rowCounter)[0], //TEXT + String lat = csvCellID.get(rowCounter)[0], //TEXT lon = csvCellID.get(rowCounter)[1], //TEXT mcc = csvCellID.get(rowCounter)[2], //int mnc = csvCellID.get(rowCounter)[3], //int @@ -685,14 +679,14 @@ public boolean populateDBeImport() { samples = csvCellID.get(rowCounter)[8], //int change = csvCellID.get(rowCounter)[9], //int radio = csvCellID.get(rowCounter)[10], //TEXT - rnc = csvCellID.get(rowCounter)[11], //int - cid = csvCellID.get(rowCounter)[12], //int short CID [<65536] +// rnc = csvCellID.get(rowCounter)[11], //int +// cid = csvCellID.get(rowCounter)[12], //int short CID [<65536] psc = csvCellID.get(rowCounter)[13]; //int // TODO: WHAT IS THIS DOING? Can we remove? // (There shouldn't be any bad PSCs in the import...) int iPsc = 0; - if(psc != null && !psc.isEmpty()) { + if (psc != null && !psc.isEmpty()) { iPsc = Integer.parseInt(psc); } @@ -733,7 +727,7 @@ public boolean populateDBeImport() { } finally { try { Thread.sleep(1000); // wait 1 second to allow user to see progress bar. - } catch(InterruptedException ex) { + } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } AIMSICD.mProgressBar.setProgress(0); @@ -745,13 +739,13 @@ public boolean populateDBeImport() { //============================================================================================= /** - * Description: Restores the database tables from a previously Exported CSV files. - * One CSV file per table with the name: "aimsicd-.csv" - * - * Issues: [ ] - * - * Notes: 1) Restoring the DB can be done from a monolithic SQLite3 DB by (check!): - * # sqlite3 aimsicd.db .csv" + *

+ * Issues: [ ] + *

+ * Notes: 1) Restoring the DB can be done from a monolithic SQLite3 DB by (check!): + * # sqlite3 aimsicd.db records = new ArrayList<>(); String next[]; @@ -778,32 +772,32 @@ public boolean restoreDB() { switch (table) { case "defaultlocation": - try{ + try { insertDefaultLocation( - records.get(i)[1].toString(), // country + records.get(i)[1], // country Integer.parseInt(records.get(i)[2]),// MCC - records.get(i)[3].toString(), // lat - records.get(i)[4].toString() // lon + records.get(i)[3], // lat + records.get(i)[4] // lon ); - } catch(Exception ee) { + } catch (Exception ee) { Log.e(TAG, "RestoreDB: Error in insertDefaultLocation()", ee); } break; case "API_keys": insertApiKeys( - records.get(i)[1].toString(), //name - records.get(i)[2].toString(), //type - records.get(i)[3].toString(), //key - records.get(i)[4].toString(), //time_add - records.get(i)[5].toString() //time_exp + records.get(i)[1], //name + records.get(i)[2], //type + records.get(i)[3], //key + records.get(i)[4], //time_add + records.get(i)[5] //time_exp ); break; case "CounterMeasures": insertCounterMeasures( - records.get(i)[1].toString(), //name - records.get(i)[2].toString(), //description + records.get(i)[1], //name + records.get(i)[2], //description Integer.parseInt(records.get(i)[3]), //thresh Double.parseDouble(records.get(i)[4]) //thfine ); @@ -811,12 +805,12 @@ public boolean restoreDB() { case "DBe_capabilities": insertDBeCapabilities( - records.get(i)[1].toString(), //MCC - records.get(i)[2].toString(), //MNC - records.get(i)[3].toString(), //LAC - records.get(i)[4].toString(), //op_name - records.get(i)[5].toString(), //band_plan - records.get(i)[6].toString() //__EXPAND___ + records.get(i)[1], //MCC + records.get(i)[2], //MNC + records.get(i)[3], //LAC + records.get(i)[4], //op_name + records.get(i)[5], //band_plan + records.get(i)[6] //__EXPAND___ ); break; @@ -824,30 +818,30 @@ public boolean restoreDB() { case "DBe_import": try { insertDBeImport( - records.get(i)[1].toString(), // DBsource - records.get(i)[2].toString(), // RAT + records.get(i)[1], // DBsource + records.get(i)[2], // RAT Integer.parseInt(records.get(i)[3]), // MCC Integer.parseInt(records.get(i)[4]), // MNC Integer.parseInt(records.get(i)[5]), // LAC Integer.parseInt(records.get(i)[6]), // CID Integer.parseInt(records.get(i)[7]), // PSC ?? - records.get(i)[8].toString(), // gps_lat - records.get(i)[9].toString(), // gps_lon + records.get(i)[8], // gps_lat + records.get(i)[9], // gps_lon Integer.parseInt(records.get(i)[10]), // isGPSexact - Integer.parseInt(records.get(i)[11]) , // avg_range + Integer.parseInt(records.get(i)[11]), // avg_range Integer.parseInt(records.get(i)[12]), // avg_signal Integer.parseInt(records.get(i)[13]), // samples - records.get(i)[14].toString(), // time_first - records.get(i)[15].toString(), // time_last + records.get(i)[14], // time_first + records.get(i)[15], // time_last 0 //Integer.parseInt(records.get(i)[16]) // TODO: rej_cause ); - } catch(Exception ee) { + } catch (Exception ee) { Log.e(TAG, "RestoreDB: Error in insertDBeImport()", ee); } break; case "DBi_bts": - try{ + try { insertBTS( Integer.parseInt(records.get(i)[1]), // MCC Integer.parseInt(records.get(i)[2]), // MNC @@ -857,44 +851,44 @@ public boolean restoreDB() { Integer.parseInt(records.get(i)[6]), // T3212 Integer.parseInt(records.get(i)[7]), // A5x Integer.parseInt(records.get(i)[8]), // ST_id - records.get(i)[9].toString(), // time_first - records.get(i)[10].toString(), // time_last + records.get(i)[9], // time_first + records.get(i)[10], // time_last Double.parseDouble(records.get(i)[11]), // lat Double.parseDouble(records.get(i)[12]) // lon ); - }catch(Exception ee){ + } catch (Exception ee) { Log.e(TAG, "RestoreDB: Error in insertBTS()", ee); } break; case "DBi_measure": - try{ + try { insertDbiMeasure( Integer.parseInt(records.get(i)[1]), // bts_id - records.get(i)[2].toString(), // nc_list - records.get(i)[3].toString(), // time - records.get(i)[4].toString(), // gpsd_lat - records.get(i)[5].toString(), // gpsd_lon + records.get(i)[2], // nc_list + records.get(i)[3], // time + records.get(i)[4], // gpsd_lat + records.get(i)[5], // gpsd_lon Integer.parseInt(records.get(i)[6]), // gpsd_accu - records.get(i)[7].toString(), // gpse_lat TODO: remove! - records.get(i)[8].toString(), // gpse_lon TODO: remove! - records.get(i)[9].toString(), // bb_power - records.get(i)[10].toString(), // bb_rf_temp - records.get(i)[11].toString(), // tx_power - records.get(i)[12].toString(), // rx_signal - records.get(i)[13].toString(), // rx_stype - records.get(i)[14].toString(), // RAT - records.get(i)[15].toString(), // BCCH - records.get(i)[16].toString(), // TMSI + records.get(i)[7], // gpse_lat TODO: remove! + records.get(i)[8], // gpse_lon TODO: remove! + records.get(i)[9], // bb_power + records.get(i)[10], // bb_rf_temp + records.get(i)[11], // tx_power + records.get(i)[12], // rx_signal + records.get(i)[13], // rx_stype + records.get(i)[14], // RAT + records.get(i)[15], // BCCH + records.get(i)[16], // TMSI Integer.parseInt(records.get(i)[17]), // TA Integer.parseInt(records.get(i)[18]), // PD Integer.parseInt(records.get(i)[19]), // BER - records.get(i)[20].toString(), // AvgEcNo + records.get(i)[20], // AvgEcNo Integer.parseInt(records.get(i)[21]), // isSubmitted Integer.parseInt(records.get(i)[22]) // isNeighbour //records.get(i)[23].toString() // TODO: con_state ); - } catch(Exception ee) { + } catch (Exception ee) { Log.e(TAG, "RestoreDB: Error in insertDbiMeasure()", ee); } break; @@ -902,16 +896,16 @@ public boolean restoreDB() { case "DetectionFlags": insertDetectionFlags( Integer.parseInt(records.get(i)[1]), //code - records.get(i)[2].toString(), //name - records.get(i)[3].toString(), //description + records.get(i)[2], //name + records.get(i)[3], //description Integer.parseInt(records.get(i)[4]), //p1 Integer.parseInt(records.get(i)[5]), //p2 Integer.parseInt(records.get(i)[6]), //p3 Double.parseDouble(records.get(i)[7]), //p1_fine Double.parseDouble(records.get(i)[8]), //p2_fine Double.parseDouble(records.get(i)[9]), //p3_fine - records.get(i)[10].toString(), //app_text - records.get(i)[11].toString(), //func_use + records.get(i)[10], //app_text + records.get(i)[11], //func_use Integer.parseInt(records.get(i)[12]), //istatus Integer.parseInt(records.get(i)[13]) //CM_id @@ -920,39 +914,39 @@ public boolean restoreDB() { case "EventLog": insertEventLog( - records.get(i)[1].toString(), //time + records.get(i)[1], //time Integer.parseInt(records.get(i)[2]), //LAC Integer.parseInt(records.get(i)[3]), //CID Integer.parseInt(records.get(i)[4]), //PSC - records.get(i)[5].toString(), //gpsd_lat - records.get(i)[6].toString(), //gpsd_lon + records.get(i)[5], //gpsd_lat + records.get(i)[6], //gpsd_lon Integer.parseInt(records.get(i)[7]), //gpsd_accu Integer.parseInt(records.get(i)[8]), //DF_id - records.get(i)[9].toString() //DF_desc + records.get(i)[9] //DF_desc ); break; case "SectorType": - insertSectorType(records.get(i)[1].toString()); + insertSectorType(records.get(i)[1]); break; case "DetectionStrings": insertDetectionStrings( - records.get(i)[1].toString(), - records.get(i)[2].toString()); + records.get(i)[1], + records.get(i)[2]); break; case "SmsData": insertSmsData( - records.get(i)[1].toString(), //time - records.get(i)[2].toString(), //number - records.get(i)[3].toString(), //smsc - records.get(i)[4].toString(), //message - records.get(i)[5].toString(), //type - records.get(i)[6].toString(), //class + records.get(i)[1], //time + records.get(i)[2], //number + records.get(i)[3], //smsc + records.get(i)[4], //message + records.get(i)[5], //type + records.get(i)[6], //class Integer.parseInt(records.get(i)[7]), //lac Integer.parseInt(records.get(i)[8]), //cid - records.get(i)[9].toString(), //rat + records.get(i)[9], //rat Double.parseDouble(records.get(i)[10]), //gps_lat Double.parseDouble(records.get(i)[11]), //gps_lon Integer.parseInt(records.get(i)[12]) //isRoaming @@ -975,43 +969,42 @@ public boolean restoreDB() { } /** - * Description: Dumps the internal aimsicd.db to a file called "aimsicd_dump.db". - * - * Requires: root + SQLite3 binary - * - * Where? Used in backupDB() and depend on the MONO_DB_DUMP boolean. - * - * Notes: 1) We probably also need to test if we have the sqlite3 binary. (See Busybox checking code.) - * - * 2) Apparently pipes doesn't work from Java... No idea why, as they appear to work - * in the AtCommandFragment.java... for checking for /dev/ files. - * - * 3) We can use either ".dump" or ".backup", but "dump" makes an SQL file, - * whereas "backup" make a binary SQLite DB. - * - * a) # sqlite3 aimsicd.db '.dump' | gzip -c >aimsicd.dump.gz - * b) # sqlite3 aimsicd.db '.dump' >aimsicd.dump - * c) # sqlite3 aimsicd.db '.backup aimsicd.back' - * - * execString = "/system/xbin/sqlite3 " + dir + "aimsicd.db '.dump' | gzip -c >" + file; - * execString = "/system/xbin/sqlite3 " + aimdir + "aimsicd.db '.dump' >" + file; - * execString = "/system/xbin/sqlite3 " + aimdir + "aimsicd.db '.backup " +file + "'"; - * - * 4) To re-import use: - * # zcat aimsicd.dump.gz | sqlite3 aimsicd.db - * + * Description: Dumps the internal aimsicd.db to a file called "aimsicd_dump.db". + *

+ * Requires: root + SQLite3 binary + *

+ * Where? Used in backupDB() and depend on the MONO_DB_DUMP boolean. + *

+ * Notes: 1) We probably also need to test if we have the sqlite3 binary. (See Busybox checking code.) + *

+ * 2) Apparently pipes doesn't work from Java... No idea why, as they appear to work + * in the AtCommandFragment.java... for checking for /dev/ files. + *

+ * 3) We can use either ".dump" or ".backup", but "dump" makes an SQL file, + * whereas "backup" make a binary SQLite DB. + *

+ * a) # sqlite3 aimsicd.db '.dump' | gzip -c >aimsicd.dump.gz + * b) # sqlite3 aimsicd.db '.dump' >aimsicd.dump + * c) # sqlite3 aimsicd.db '.backup aimsicd.back' + *

+ * execString = "/system/xbin/sqlite3 " + dir + "aimsicd.db '.dump' | gzip -c >" + file; + * execString = "/system/xbin/sqlite3 " + aimdir + "aimsicd.db '.dump' >" + file; + * execString = "/system/xbin/sqlite3 " + aimdir + "aimsicd.db '.backup " +file + "'"; + *

+ * 4) To re-import use: + * # zcat aimsicd.dump.gz | sqlite3 aimsicd.db */ - private void dumpDB() { + private void dumpDB() { AIMSICD.mProgressBar.setMax(2); AIMSICD.mProgressBar.setProgress(1); - File dumpdir = new File(FOLDER); + File dumpdir = new File(mExternalFilesDirPath); //if (!dir.exists()) { dir.mkdirs(); } File file = new File(dumpdir, "aimsicd_dump.db"); //Bad coding? (What is AOS standard?) //Context.getFilesDir().getPath("com.SecUpwN.AIMSICD/databases"); ???? - String aimdir = "/data/data/com.SecUpwN.AIMSICD/databases/"; + String aimdir = new File(mDatabasePath).getParent(); String execString = "/system/xbin/sqlite3 " + aimdir + "aimsicd.db '.backup " + file + "'"; try { @@ -1027,11 +1020,11 @@ private void dumpDB() { /** - * Description: Backup the database tables to CSV files (or monolithic dump file) - * - * Depends: On the Boolean MONO_DB_DUMP to indicate if we want to try to - * dump a monolithic DB using the rooted shell + sqlite3 binary - * method above. + * Description: Backup the database tables to CSV files (or monolithic dump file) + *

+ * Depends: On the Boolean MONO_DB_DUMP to indicate if we want to try to + * dump a monolithic DB using the rooted shell + sqlite3 binary + * method above. * * @return boolean indicating backup outcome */ @@ -1050,24 +1043,29 @@ public boolean backupDB() { } } - /** TODO: Is this redundant? REMOVE? - * Description: Exports the database tables to CSV files - * - * Issues: [ ] We should consider having a better file selector here, so that - * the user can select his own location for storing the backup files. - * [ ] Don't use progress bar for each column item, but instead each table. + /** + * TODO: Is this redundant? REMOVE? + * Description: Exports the database tables to CSV files + *

+ * Issues: [ ] We should consider having a better file selector here, so that + * the user can select his own location for storing the backup files. + * [ ] Don't use progress bar for each column item, but instead each table. * * @param tableName String representing table name to export */ private void backup(String tableName) { Log.i(TAG, "Database Backup: " + DB_NAME); - File dir = new File(FOLDER); - if (!dir.exists()) { dir.mkdirs(); } // We should probably add some more error handling here. + File dir = new File(mExternalFilesDirPath); + if (!dir.exists()) { + if (!dir.mkdirs()) { + Log.e(TAG, "Backup(): Cannot create directory structure to " + dir.getAbsolutePath()); + } + } // We should probably add some more error handling here. File file = new File(dir, "aimsicd-" + tableName + ".csv"); try { - file.createNewFile(); + Log.i(TAG, "Backup(): Backup file was created? " + file.createNewFile()); CSVWriter csvWrite = new CSVWriter(new FileWriter(file)); Log.d(TAG, "DB backup() tableName: " + tableName); @@ -1098,61 +1096,60 @@ private void backup(String tableName) { // ==================================================================== /** - * What: This is the DBe_import data consistency check - * - * Description: This method checks each imported BTS data for consistency - * and correctness according to general 3GPP LAC/CID/RAT rules - * and according to the app settings: - * - * tf_settings (currently hard-coded) - * min_gps_precision (currently hard-coded) - * - * So there are really two steps in this procedure: - * a) Remove bad BTSs from DBe_import - * b) Mark unsafe BTSs in the DBe_import with "rej_cause" value. - * - * See: #253 http://tinyurl.com/lybrfxb - * #203 http://tinyurl.com/mzgjdcz - * - * We filter: - * - * Used: - * RequestTask.java :: onPostExecute() - * - * Issues: - * - * [ ] Look into "long CID" and "Short CID" for UMTS/LTE... - * http://wiki.opencellid.org/wiki/FAQ - * - * The formula for the long cell ID is as follows: - * Long CID = 65536 * RNC + CID - * - * If you have the Long CID, you can get RNC and CID in the following way: - * RNC = Long CID / 65536 (integer division) - * CID = Long CID mod 65536 (modulo operation) - * - * TODO: (1) Implement some kind of counter, to count how many cells was removed. - * TODO: (2) Better description of what was removed. - * TODO: (3) Give a return value for success/failure - * TODO: (4) Implement the "rej_cause" check and UPDATE table. - * + * What: This is the DBe_import data consistency check + *

+ * Description: This method checks each imported BTS data for consistency + * and correctness according to general 3GPP LAC/CID/RAT rules + * and according to the app settings: + *

+ * tf_settings (currently hard-coded) + * min_gps_precision (currently hard-coded) + *

+ * So there are really two steps in this procedure: + * a) Remove bad BTSs from DBe_import + * b) Mark unsafe BTSs in the DBe_import with "rej_cause" value. + *

+ * See: #253 http://tinyurl.com/lybrfxb + * #203 http://tinyurl.com/mzgjdcz + *

+ * We filter: + *

+ * Used: + * RequestTask.java :: onPostExecute() + *

+ * Issues: + *

+ * [ ] Look into "long CID" and "Short CID" for UMTS/LTE... + * http://wiki.opencellid.org/wiki/FAQ + *

+ * The formula for the long cell ID is as follows: + * Long CID = 65536 * RNC + CID + *

+ * If you have the Long CID, you can get RNC and CID in the following way: + * RNC = Long CID / 65536 (integer division) + * CID = Long CID mod 65536 (modulo operation) + *

+ * TODO: (1) Implement some kind of counter, to count how many cells was removed. + * TODO: (2) Better description of what was removed. + * TODO: (3) Give a return value for success/failure + * TODO: (4) Implement the "rej_cause" check and UPDATE table. + *

* Notes: (a) By using rawQuery, we could count the number of items affected. - * mDb.rawQuery(sqlq, null); - * But rawQuery() is not executed until there is an associated Cursor operation! - * - * (b) - * - * - * ChangeLog: - * 2015-08-01 E:V:A Updated Queries to reflect new DB structure - * + * mDb.rawQuery(sqlq, null); + * But rawQuery() is not executed until there is an associated Cursor operation! + *

+ * (b) + *

+ *

+ * ChangeLog: + * 2015-08-01 E:V:A Updated Queries to reflect new DB structure */ public void checkDBe() { // We hard-code these for now, but should be in the settings eventually - int tf_settings=30; // [days] Minimum acceptable number of days since "time_first" seen. - int min_gps_precision=50; // [m] Minimum acceptable GPS accuracy in meters. +// int tf_settings = 30; // [days] Minimum acceptable number of days since "time_first" seen. + int min_gps_precision = 50; // [m] Minimum acceptable GPS accuracy in meters. - String sqlq; // SQL Query string + String sqlQuery; // SQL Query string //============================================================= //=== DELETE bad cells from BTS data @@ -1161,41 +1158,41 @@ public void checkDBe() { Log.d(TAG, "CheckDBe() Attempting to delete bad import data from DBe_import table..."); // =========== samples =========== - sqlq = "DELETE FROM DBe_import WHERE samples < 1"; - mDb.execSQL(sqlq); + sqlQuery = "DELETE FROM DBe_import WHERE samples < 1"; + mDb.execSQL(sqlQuery); // =========== avg_range =========== // TODO: OCID data marks many good BTS with a negative range so we can't use this yet. // TODO: Also delete cells where the avg_range is way too large, say > 2000 meter - //sqlq = "DELETE FROM DBe_import WHERE avg_range < 1 OR avg_range > 2000"; - //mDb.rawQuery(sqlq, null); + //sqlQuery = "DELETE FROM DBe_import WHERE avg_range < 1 OR avg_range > 2000"; + //mDb.rawQuery(sqlQuery, null); // =========== LAC =========== - sqlq = "DELETE FROM DBe_import WHERE LAC < 1"; - mDb.execSQL(sqlq); + sqlQuery = "DELETE FROM DBe_import WHERE LAC < 1"; + mDb.execSQL(sqlQuery); // We should delete cells with CDMA (4) LAC not in [1,65534] but we can simplify this to: // Delete ANY cells with a LAC not in [1,65534] - sqlq = "DELETE FROM DBe_import WHERE LAC > 65534"; - mDb.execSQL(sqlq); + sqlQuery = "DELETE FROM DBe_import WHERE LAC > 65534"; + mDb.execSQL(sqlQuery); // Delete cells with GSM/UMTS/LTE (1/2/3/13 ??) (or all others?) LAC not in [1,65533] - //sqlq = "DELETE FROM DBe_import WHERE LAC > 65533 AND RAT != 'CDMA'"; - //mDb.rawQuery(sqlq, null); + //sqlQuery = "DELETE FROM DBe_import WHERE LAC > 65533 AND RAT != 'CDMA'"; + //mDb.rawQuery(sqlQuery, null); // =========== CID =========== - sqlq = "DELETE FROM DBe_import WHERE CID < 1"; - mDb.execSQL(sqlq); + sqlQuery = "DELETE FROM DBe_import WHERE CID < 1"; + mDb.execSQL(sqlQuery); // We should delete cells with UMTS/LTE (3,13) CID not in [1,268435455] (0xFFF FFFF) but // we can simplify this to: // Delete ANY cells with a CID not in [1,268435455] - sqlq = "DELETE FROM DBe_import WHERE CID > 268435455"; - mDb.execSQL(sqlq); + sqlQuery = "DELETE FROM DBe_import WHERE CID > 268435455"; + mDb.execSQL(sqlQuery); // Delete cells with GSM/CDMA (1-3,4) CID not in [1,65534] - sqlq = "DELETE FROM DBe_import WHERE CID > 65534 AND (RAT='GSM' OR RAT='CDMA')"; - mDb.execSQL(sqlq); + sqlQuery = "DELETE FROM DBe_import WHERE CID > 65534 AND (RAT='GSM' OR RAT='CDMA')"; + mDb.execSQL(sqlQuery); // SELECT count(*) from DBe_import; Log.i(TAG, "CheckDBe() Deleted BTS entries from DBe_import table with bad LAC/CID..."); @@ -1207,20 +1204,20 @@ public void checkDBe() { // =========== isGPSexact =========== // Increase rej_cause, when: the GPS position of the BTS is not exact: // NOTE: In OCID: "changeable"=1 ==> isGPSexact=0 - sqlq = "UPDATE DBe_import SET rej_cause = rej_cause + 3 WHERE isGPSexact=0"; - mDb.execSQL(sqlq); + sqlQuery = "UPDATE DBe_import SET rej_cause = rej_cause + 3 WHERE isGPSexact=0"; + mDb.execSQL(sqlQuery); // =========== avg_range =========== // Increase rej_cause, when: the average range is < a minimum GPS precision - sqlq = "UPDATE DBe_import SET rej_cause = rej_cause + 3 WHERE avg_range < " + min_gps_precision; - mDb.execSQL(sqlq); + sqlQuery = "UPDATE DBe_import SET rej_cause = rej_cause + 3 WHERE avg_range < " + min_gps_precision; + mDb.execSQL(sqlQuery); // =========== time_first =========== // Increase rej_cause, when: the time first seen is less than a number of days. // TODO: We need to convert tf_settings to seconds since epoch/unix time... // int tf_settings = current_time[s] - (3600 * 24 * tf_settings) ??? - //sqlq = "UPDATE DBe_import SET rej_cause = rej_cause + 1 WHERE time_first < " + tf_settings; - //mDb.execSQL(sqlq); + //sqlQuery = "UPDATE DBe_import SET rej_cause = rej_cause + 1 WHERE time_first < " + tf_settings; + //mDb.execSQL(sqlQuery); } @@ -1231,15 +1228,15 @@ public void checkDBe() { /** * Description: Remove too old signal strengths entries from DBi_measure table, - * given a particular LAC,CID,PSC,RAT (or all?). - * - * TODO: Why do we need this at all? - * + * given a particular LAC,CID,PSC,RAT (or all?). + *

+ * TODO: Why do we need this at all? + *

* Note: WARNING! Do not remove based upon time only, as that would remove - * all other measurement entries as well. - * + * all other measurement entries as well. + *

* Issues: TODO: timestamp in DBi_measure is a String, - * but the one from SignalStrengthTracker is a long + * but the one from SignalStrengthTracker is a long */ public void cleanseCellStrengthTables(long maxTime) { @@ -1258,7 +1255,7 @@ public int getAverageSignalStrength(int cellID) { // todo: "SELECT AVG(rx_signal) FROM DBi_measure,DBi_bts WHERE CID= %d", // E:V:A "SELECT avg(rx_signal) FROM DBi_measure WHERE bts_id= %d", cellID); - Cursor c = mDb.rawQuery(query,null); + Cursor c = mDb.rawQuery(query, null); c.moveToFirst(); int lAnswer = c.getInt(0); c.close(); @@ -1272,13 +1269,13 @@ public int getAverageSignalStrength(int cellID) { // ==================================================================== // Get all detection strings // ==================================================================== - public ArrayList getDetectionStrings(){ + public ArrayList getDetectionStrings() { - Cursor cursor = mDb.rawQuery("SELECT * FROM DetectionStrings",null); + Cursor cursor = mDb.rawQuery("SELECT * FROM DetectionStrings", null); ArrayList detectionStrings = new ArrayList<>(); - if(cursor.getCount() > 0) { + if (cursor.getCount() > 0) { while (cursor.moveToNext()) { AdvanceUserItems setItems = new AdvanceUserItems(); setItems.setDetection_string(cursor.getString(cursor.getColumnIndex("det_str"))); @@ -1293,7 +1290,7 @@ public ArrayList getDetectionStrings(){ detectionStrings.add(setItems); } cursor.close(); - return detectionStrings; + return detectionStrings; } public boolean deleteDetectedSms(long deleteme) { @@ -1301,9 +1298,9 @@ public boolean deleteDetectedSms(long deleteme) { String mTAG = "AIMSICDDbAdapter"; try { - mDb.delete("SmsData","_id=" + deleteme,null); + mDb.delete("SmsData", "_id=" + deleteme, null); return true; - } catch (Exception ee){ + } catch (Exception ee) { Log.i(TAG, mTAG + ": Deleting SMS data failed", ee); } return false; @@ -1314,7 +1311,7 @@ public boolean deleteDetectionString(String deleteme) { try { mDb.delete("DetectionStrings", "det_str='" + deleteme + "'", null); return true; - } catch (Exception ee){ + } catch (Exception ee) { Log.i(TAG, "Deleting detection string failed", ee); } return false; @@ -1324,22 +1321,22 @@ public boolean deleteDetectionString(String deleteme) { //==================================================================== // Insert new detection strings into database //==================================================================== + /** * Description: When inserting strings it has to be in the format: - * "i am a type 0 string". These strings can be found in main logcat. - * + * "i am a type 0 string". These strings can be found in main logcat. + *

* Issues: [ ] Need to change time data type to INTEGER in DB - * + *

* NOTES: - * - * TYPE0 SILENTVOICE FLASH <--- These have to be in CAPS - * ContentValues newconvalues = new ContentValues(); - * newconvalues.put(DETECTION_STRINGS_LOGCAT_STRING, "your string goes here"); - * newconvalues.put(DETECTION_STRINGS_SMS_TYPE, "TYPE0"); - * database.insert(DETECTION_STRINGS_TABLE_NAME,,null,newconvalues); - * + *

+ * TYPE0 SILENTVOICE FLASH <--- These have to be in CAPS + * ContentValues newconvalues = new ContentValues(); + * newconvalues.put(DETECTION_STRINGS_LOGCAT_STRING, "your string goes here"); + * newconvalues.put(DETECTION_STRINGS_SMS_TYPE, "TYPE0"); + * database.insert(DETECTION_STRINGS_TABLE_NAME,,null,newconvalues); + *

* ChangeLog: - * */ public boolean insertNewDetectionString(ContentValues newString) { @@ -1366,7 +1363,7 @@ public boolean insertNewDetectionString(ContentValues newString) { return false; } - public CapturedSmsData storeCapturedSms(CapturedSmsData smsdata){ + public CapturedSmsData storeCapturedSms(CapturedSmsData smsdata) { ContentValues values = new ContentValues(); @@ -1383,14 +1380,14 @@ public CapturedSmsData storeCapturedSms(CapturedSmsData smsdata){ long insertId = mDb.insert("SmsData", null, values); smsdata.setId(insertId); - return smsdata; + return smsdata; } // Boolean Check if a give timestamp already exists in SmsData table - public boolean isTimeStampInDB(String timestamp){ + public boolean isTimeStampInDB(String timestamp) { String check4timestamp = String.format( "SELECT time FROM SmsData WHERE time = \"%s\"", timestamp); - Cursor cursor = mDb.rawQuery(check4timestamp,null); + Cursor cursor = mDb.rawQuery(check4timestamp, null); final boolean exists = cursor.getCount() > 0; cursor.close(); return exists; @@ -1416,38 +1413,38 @@ public boolean isTimeStampInDB(String timestamp){ "lon" TEXT returns Default Mcc Locations */ - public Cursor returnDefaultLocation(){ - return mDb.rawQuery("SELECT * FROM defaultlocation",null); + public Cursor returnDefaultLocation() { + return mDb.rawQuery("SELECT * FROM defaultlocation", null); } /** - Returns DBe_import contents - - Used in: - DbViewerFragment.java - MapViewerOsmDroid.java - - Returned Columns: - "_id" INTEGER PRIMARY KEY AUTOINCREMENT, - "DBsource" TEXT NOT NULL, - "RAT" TEXT, - "MCC" INTEGER, - "MNC" INTEGER, - "LAC" INTEGER, - "CID" INTEGER, - "PSC" INTEGER, - "gps_lat" REAL, - "gps_lon" REAL, - "isGPSexact" INTEGER, - "avg_range" INTEGER, - "avg_signal" INTEGER, - "samples" INTEGER, - "time_first" INTEGER, - "time_last" INTEGER, - "rej_cause" INTEGER + * Returns DBe_import contents + *

+ * Used in: + * DbViewerFragment.java + * MapViewerOsmDroid.java + *

+ * Returned Columns: + * "_id" INTEGER PRIMARY KEY AUTOINCREMENT, + * "DBsource" TEXT NOT NULL, + * "RAT" TEXT, + * "MCC" INTEGER, + * "MNC" INTEGER, + * "LAC" INTEGER, + * "CID" INTEGER, + * "PSC" INTEGER, + * "gps_lat" REAL, + * "gps_lon" REAL, + * "isGPSexact" INTEGER, + * "avg_range" INTEGER, + * "avg_signal" INTEGER, + * "samples" INTEGER, + * "time_first" INTEGER, + * "time_last" INTEGER, + * "rej_cause" INTEGER */ - public Cursor returnDBeImport(){ - return mDb.rawQuery("SELECT * FROM DBe_import",null); + public Cursor returnDBeImport() { + return mDb.rawQuery("SELECT * FROM DBe_import", null); } // TODO: THESE ARE OUTDATED!! Please see design and update @@ -1467,8 +1464,8 @@ public Cursor returnDBeImport(){ "LAT" REAL NOT NULL, -- NULL should be okay, as GPS is not always available "LON" REAL NOT NULL */ - public Cursor returnDBiBts(){ - return mDb.rawQuery("SELECT * FROM DBi_bts",null); + public Cursor returnDBiBts() { + return mDb.rawQuery("SELECT * FROM DBi_bts", null); } // TODO: THESE ARE OUTDATED!! Please see design and update @@ -1498,13 +1495,13 @@ public Cursor returnDBiBts(){ "isSubmitted" INTEGER DEFAULT 0, "isNeighbour" INTEGER DEFAULT 0, */ - public Cursor returnDBiMeasure(){ + public Cursor returnDBiMeasure() { // This is special since this table is linked to DBi_bts by a foreign key, // so if you're not able to get LAC/CID, it's probably due to the FOREIGN KEY Pragma being OFF, // then try with: // "SELECT * FROM DBi_measure, DBi_bts WHERE DBi_measure.bts_id=DBi_bts.CID;" // NOTE: TODO: bts_id should not be populated, then replace with "DBi_measure.bts_id=DBi_bts._id;" - return mDb.rawQuery("SELECT * FROM DBi_measure",null); + return mDb.rawQuery("SELECT * FROM DBi_measure", null); } /* @@ -1524,36 +1521,37 @@ public Cursor returnDBiMeasure(){ "istatus" INTEGER, "CM_id" INTEGER */ - public Cursor returnDetectionFlags(){ - return mDb.rawQuery("SELECT * FROM DetectionFlags",null); + public Cursor returnDetectionFlags() { + return mDb.rawQuery("SELECT * FROM DetectionFlags", null); } // TODO: THESE ARE OUTDATED!! Please see design and update + /** - Returned Columns: - "_id" INTEGER PRIMARY KEY AUTOINCREMENT, - "time" TEXT NOT NULL, - "LAC" INTEGER NOT NULL, - "CID" INTEGER NOT NULL, - "PSC" INTEGER, - "gpsd_lat" TEXT,--Should this be double? - "gpsd_lon" TEXT,--Should this be double? - "gpsd_accu" INTEGER, - "DF_id" INTEGER, - "DF_description" TEXT, + * Returned Columns: + * "_id" INTEGER PRIMARY KEY AUTOINCREMENT, + * "time" TEXT NOT NULL, + * "LAC" INTEGER NOT NULL, + * "CID" INTEGER NOT NULL, + * "PSC" INTEGER, + * "gpsd_lat" TEXT,--Should this be double? + * "gpsd_lon" TEXT,--Should this be double? + * "gpsd_accu" INTEGER, + * "DF_id" INTEGER, + * "DF_description" TEXT, */ public Cursor returnEventLogData() { - return mDb.rawQuery("SELECT * FROM EventLog",null); + return mDb.rawQuery("SELECT * FROM EventLog", null); } /** - Returned Columns: - "_id" INTEGER PRIMARY KEY AUTOINCREMENT, - "detection_str" TEXT, - "sms_type" TEXT--(WapPush MWI TYPE0 etc..) + * Returned Columns: + * "_id" INTEGER PRIMARY KEY AUTOINCREMENT, + * "detection_str" TEXT, + * "sms_type" TEXT--(WapPush MWI TYPE0 etc..) */ public Cursor returnDetectionStrings() { - return mDb.rawQuery("SELECT * FROM DetectionStrings",null); + return mDb.rawQuery("SELECT * FROM DetectionStrings", null); } // TODO: THESE ARE OUTDATED!! Please see design and update @@ -1573,8 +1571,8 @@ public Cursor returnDetectionStrings() { "gps_lon" REAL, "isRoaming" INTEGER */ - public Cursor returnSmsData(){ - return mDb.rawQuery("SELECT * FROM SmsData",null); + public Cursor returnSmsData() { + return mDb.rawQuery("SELECT * FROM SmsData", null); } //----END OF RETURN DATABASE CURSORS------// @@ -1584,7 +1582,7 @@ public Cursor returnSmsData(){ //==================================================================== // TODO: Remove this, it's confusing and doesn't seem necessary! - public void insertDefaultLocation(String country, int mcc, String lat, String lon){ + public void insertDefaultLocation(String country, int mcc, String lat, String lon) { ContentValues def_location = new ContentValues(); def_location.put("country", country); @@ -1600,8 +1598,8 @@ public void insertDefaultLocation(String country, int mcc, String lat, String lo "SELECT * FROM defaultlocation WHERE country = \"%s\" AND MCC = %d ", country, mcc); - Cursor cursor = mDb.rawQuery(query,null); - if(cursor.getCount() <= 0) { + Cursor cursor = mDb.rawQuery(query, null); + if (cursor.getCount() <= 0) { // <= 0 means country is not in database yet mDb.insert("defaultlocation", null, def_location); } @@ -1612,7 +1610,7 @@ public boolean insertApiKeys(String name, String type, String key, String time_add, - String time_exp){ + String time_exp) { ContentValues ApiKeys = new ContentValues(); ApiKeys.put("name", name); @@ -1622,10 +1620,10 @@ public boolean insertApiKeys(String name, ApiKeys.put("time_exp", time_exp); String query = String.format("SELECT * FROM API_keys WHERE key = \"%s\"", key); - Cursor cursor = mDb.rawQuery(query,null); + Cursor cursor = mDb.rawQuery(query, null); // Only insert a new key if the key not already in DB - if( cursor.getCount() <= 0) { + if (cursor.getCount() <= 0) { mDb.insert("API_keys", null, ApiKeys); cursor.close(); return true; @@ -1647,7 +1645,7 @@ public void insertCounterMeasures(String name, String description, } /* - "MCC" TEXT, + "MCC" TEXT, "MNC" TEXT, "LAC" TEXT, "op_name" TEXT, @@ -1671,25 +1669,24 @@ public void insertDBeCapabilities(String mcc, String mnc, String lac, String op_ } /** - * Description: This method is used to insert and populate the downloaded or previously - * backed up OCID details into the DBe_import database table. - * - * It also prevents adding multiple entries of the same cell-id, when OCID - * downloads are repeated. - * - * Issues: [ ] None, but see GH issue #303 for a smarter OCID download handler. - * - * Notes: a) Move to: CellTracker.java see: - * https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/290#issuecomment-72303486 - * b) OCID CellID is of the "long form" (>65535) when available... - * c) is also used to where CSV data is populating the opencellid table. - * - * - - * - * TODO: @EVA update comments as not I don't think there is an issue with this - * @banjaxbanjo: What do you mean? - * - * + * Description: This method is used to insert and populate the downloaded or previously + * backed up OCID details into the DBe_import database table. + *

+ * It also prevents adding multiple entries of the same cell-id, when OCID + * downloads are repeated. + *

+ * Issues: [ ] None, but see GH issue #303 for a smarter OCID download handler. + *

+ * Notes: a) Move to: CellTracker.java see: + * https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/290#issuecomment-72303486 + * b) OCID CellID is of the "long form" (>65535) when available... + * c) is also used to where CSV data is populating the opencellid table. + *

+ * - + *

+ * TODO: @EVA update comments as not I don't think there is an issue with this + *

+ * banjaxbanjo: What do you mean? */ public void insertDBeImport(String db_src, String rat, int mcc, int mnc, int lac, int cid, int psc, String lat, String lon, int isGpsExact, @@ -1721,7 +1718,7 @@ public void insertDBeImport(String db_src, String rat, int mcc, int mnc, int lac "SELECT LAC,CID FROM DBe_import WHERE LAC = %d AND CID = %d ", lac, cid); Cursor cursor = mDb.rawQuery(query, null); - if(cursor.getCount() <= 0) { // <= 0 means cell is not in database yet + if (cursor.getCount() <= 0) { // <= 0 means cell is not in database yet mDb.insert("DBe_import", null, dbeImport); } cursor.close(); @@ -1729,12 +1726,12 @@ public void insertDBeImport(String db_src, String rat, int mcc, int mnc, int lac /** * Description: Created this because we don't need to insert all the data in this table - * since we don't yet have items like TMSI etc. + * since we don't yet have items like TMSI etc. */ public void insertBTS(Cell cell) { // If LAC and CID are not already in DBi_bts, then add them. - if(!cellInDbiBts(cell.getLAC(), cell.getCID())) { + if (!cellInDbiBts(cell.getLAC(), cell.getCID())) { ContentValues values = new ContentValues(); values.put("MCC", cell.getMCC()); @@ -1759,14 +1756,14 @@ public void insertBTS(Cell cell) { Log.i(TAG, "DBi_bts was populated."); } else { - // If cell is already in the DB, update it to last time seen and - // update its GPS coordinates, if not 0.0 + // If cell is already in the DB, update it to last time seen and + // update its GPS coordinates, if not 0.0 ContentValues values = new ContentValues(); values.put("time_last", MiscUtils.getCurrentTimeStamp()); // TODO NO! These should be exact GPS from DBe_import or by manual addition! // Only update if GPS coordinates are good - if(Double.doubleToRawLongBits(cell.getLat()) != 0 + if (Double.doubleToRawLongBits(cell.getLat()) != 0 && Double.doubleToRawLongBits(cell.getLat()) != 0 && Double.doubleToRawLongBits(cell.getLon()) != 0 && Double.doubleToRawLongBits(cell.getLon()) != 0) { @@ -1777,14 +1774,14 @@ public void insertBTS(Cell cell) { // This is the native update equivalent to: // "UPDATE Dbi_bts time_last=...,gps_lat=..., gps_lon=... WHERE CID=..." // update (String table, ContentValues values, String whereClause, String[] whereArgs) - mDb.update("DBi_bts", values,"CID=?", new String[]{Integer.toString(cell.getCID())} ); + mDb.update("DBi_bts", values, "CID=?", new String[]{Integer.toString(cell.getCID())}); Log.i(TAG, "DBi_bts updated: CID=" + cell.getCID() + " LAC=" + cell.getLAC()); } // TODO: This doesn't make sense, if it's in DBi_bts it IS part of DBi_measure! // Checking to see if CID (now bts_id) is already in DBi_measure, if not add it. - if(!cellInDbiMeasure(cell.getCID())) { + if (!cellInDbiMeasure(cell.getCID())) { ContentValues dbiMeasure = new ContentValues(); dbiMeasure.put("bts_id", cell.getCID()); // TODO: No!! Comment this out! @@ -1793,10 +1790,10 @@ public void insertBTS(Cell cell) { String slat = String.valueOf(cell.getLat()); String slon = String.valueOf(cell.getLon()); - if (slat == null) { + if (slat.isEmpty()) { slat = "0.0"; } - if (slon == null) { + if (slon.isEmpty()) { slat = "0.0"; } dbiMeasure.put("gpsd_lat", slat); @@ -1804,7 +1801,7 @@ public void insertBTS(Cell cell) { dbiMeasure.put("gpsd_accu", cell.getAccuracy()); dbiMeasure.put("bb_power", "0"); //TODO: This is not yet available, setting to "0" - dbiMeasure.put("tx_power","0"); //TODO putting 0 here as we don't have this value yet + dbiMeasure.put("tx_power", "0"); //TODO putting 0 here as we don't have this value yet dbiMeasure.put("rx_signal", String.valueOf(cell.getDBM())); //TODO putting cell.getDBM() here so we have some signal for OCID upload. dbiMeasure.put("RAT", String.valueOf(cell.getNetType())); dbiMeasure.put("TA", cell.getTimingAdvance()); //TODO does this actually get timing advance? @@ -1822,12 +1819,12 @@ public void insertBTS(Cell cell) { //dbiMeasure.put("nc_list", nc_list); //dbiMeasure.put("time", MiscUtils.getCurrentTimeStamp()); - if(Double.doubleToRawLongBits(cell.getLat()) != 0 + if (Double.doubleToRawLongBits(cell.getLat()) != 0 && Double.doubleToRawLongBits(cell.getLon()) != 0) { dbiMeasure.put("gpsd_lat", cell.getLat()); dbiMeasure.put("gpsd_lon", cell.getLon()); } - if(Double.doubleToRawLongBits(cell.getAccuracy()) != 0 + if (Double.doubleToRawLongBits(cell.getAccuracy()) != 0 && cell.getAccuracy() > 0) { dbiMeasure.put("gpsd_accu", cell.getAccuracy()); } @@ -1843,7 +1840,7 @@ public void insertBTS(Cell cell) { // dbiMeasure.put("tx_power", String.valueOf(cell.getRssi())); // dbiMeasure.put("rx_signal",String.valueOf(cell.getRssi())); //} - if(cell.getDBM() > 0) { + if (cell.getDBM() > 0) { dbiMeasure.put("rx_signal", String.valueOf(cell.getDBM())); // [dBm] } @@ -1851,7 +1848,7 @@ public void insertBTS(Cell cell) { //dbiMeasure.put("RAT", String.valueOf(cell.getNetType())); //dbiMeasure.put("BCCH",BCCH); //dbiMeasure.put("TMSI",TMSI); - if(cell.getTimingAdvance() > 0) { + if (cell.getTimingAdvance() > 0) { dbiMeasure.put("TA", cell.getTimingAdvance()); // Only available on API >16 on LTE } @@ -1862,7 +1859,7 @@ public void insertBTS(Cell cell) { //dbiMeasure.put("AvgEcNo",AvgEcNo); // TODO: I need to check this... mDb.update("DBi_measure", dbiMeasure, "bts_id=?", new String[]{Integer.toString(cell.getCID())}); - Log.i(TAG, "DBi_measure updated bts_id="+cell.getCID()); + Log.i(TAG, "DBi_measure updated bts_id=" + cell.getCID()); } @@ -1875,7 +1872,7 @@ public void insertBTS(Cell cell) { */ // TODO: THESE ARE OUTDATED!! Please see design and update public void insertBTS(int mcc, int mnc, int lac, int cid, int psc, int t3212, int a5x, - int st_id, String time_first, String time_last, double lat, double lon) { + int st_id, String time_first, String time_last, double lat, double lon) { if (cid != -1) { // Populate Content Values for INSERT or UPDATE @@ -1894,9 +1891,9 @@ public void insertBTS(int mcc, int mnc, int lac, int cid, int psc, int t3212, in btsValues.put("gps_lon", lon); // Only insert new cell if its not in DBi_bts - if(!cellInDbiBts(lac,cid)) { + if (!cellInDbiBts(lac, cid)) { mDb.insert("DBi_bts", null, btsValues); - }else{ + } else { // ======================================================================= // TODO: EVA do I need to update an already known cell? // Good question! The DBi_bts is meant to be physical (non-volatile) and @@ -1907,7 +1904,7 @@ public void insertBTS(int mcc, int mnc, int lac, int cid, int psc, int t3212, in // We could consider adding already known cells, if ANY of their parameters (not time) // has changed. At the moment this is only PSC, since we don't have the others... // ======================================================================= - mDb.update( "DBi_bts", btsValues, "CID=?", new String[]{Integer.toString(cid)} ); + mDb.update("DBi_bts", btsValues, "CID=?", new String[]{Integer.toString(cid)}); Log.i(TAG, "Warning: Physical cell data in DBi_bts has changed! CID=" + cid); } } @@ -1916,13 +1913,12 @@ public void insertBTS(int mcc, int mnc, int lac, int cid, int psc, int t3212, in /** * Description: Inserts a measurement into the DBi_measure and DBi_bts tables - * Used be restoreDB() + * Used be restoreDB() * Issues: - * [ ] Still not adding entry to DBi_bts - * [ ] Where is this used and how? - * [ ] MAYBE it's current use is still okay? - * [ ] TODO: Using bts_id is WRONG! That is a foreign key id in the DBi_bts and used in DBi_measure - * + * [ ] Still not adding entry to DBi_bts + * [ ] Where is this used and how? + * [ ] MAYBE it's current use is still okay? + * [ ] TODO: Using bts_id is WRONG! That is a foreign key id in the DBi_bts and used in DBi_measure */ public void insertDbiMeasure(int bts_id, String nc_list, @@ -1945,15 +1941,15 @@ public void insertDbiMeasure(int bts_id, int BER, String AvgEcNo, int isSubmitted, - int isNeighbour){ + int isNeighbour) { // Check if a bts_id is already stored in DBi_measure. Only adds new cell if false // @banjaxbanjo: No this is wrong... We should always add new measurements // - if(cellInDbiMeasure(bts_id)){ + if (cellInDbiMeasure(bts_id)) { ContentValues dbiMeasure = new ContentValues(); - dbiMeasure.put("bts_id",bts_id); // TODO: comment this out! + dbiMeasure.put("bts_id", bts_id); // TODO: comment this out! dbiMeasure.put("nc_list", nc_list); dbiMeasure.put("time", time); @@ -1986,99 +1982,98 @@ public void insertDbiMeasure(int bts_id, /** * Description: This inserts Detection Flag data that is used to fine tune the various - * available detection mechanisms. (See Detection List in issue #230) - * - * These parameters are described elsewhere, but should be included here - * for completeness and reference. - * - * There's also a CounterMeasure id to link to possible future counter measures. + * available detection mechanisms. (See Detection List in issue #230) + *

+ * These parameters are described elsewhere, but should be included here + * for completeness and reference. + *

+ * There's also a CounterMeasure id to link to possible future counter measures. * Issues: - * [ ] - * + * [ ] */ public void insertDetectionFlags(int code, String name, String description, - int p1,int p2,int p3, - double p1_fine,double p2_fine,double p3_fine, + int p1, int p2, int p3, + double p1_fine, double p2_fine, double p3_fine, String app_text, String func_use, int istatus, int CM_id - ){ + ) { ContentValues detectionFlags = new ContentValues(); - detectionFlags.put("code",code); - detectionFlags.put("name",name); - detectionFlags.put("description",description); - detectionFlags.put("p1",p1); - detectionFlags.put("p2",p2); - detectionFlags.put("p3",p3); - detectionFlags.put("p1_fine",p1_fine); - detectionFlags.put("p2_fine",p2_fine); - detectionFlags.put("p3_fine",p3_fine); - detectionFlags.put("app_text",app_text); - detectionFlags.put("func_use",func_use); - detectionFlags.put("istatus",istatus); - detectionFlags.put("CM_id",CM_id); + detectionFlags.put("code", code); + detectionFlags.put("name", name); + detectionFlags.put("description", description); + detectionFlags.put("p1", p1); + detectionFlags.put("p2", p2); + detectionFlags.put("p3", p3); + detectionFlags.put("p1_fine", p1_fine); + detectionFlags.put("p2_fine", p2_fine); + detectionFlags.put("p3_fine", p3_fine); + detectionFlags.put("app_text", app_text); + detectionFlags.put("func_use", func_use); + detectionFlags.put("istatus", istatus); + detectionFlags.put("CM_id", CM_id); mDb.insert("DetectionFlags", null, detectionFlags); } /** * Description: Inserts log data into the EventLog table, using data provided by - * the TelephonyManager (TM) or an already backed up EvenLog database... - * - * If you just need to add an event with currently connected TM data such - * as CID,LAC,PSC,GPS, then use the simple version called toEventLog(), - * defined below. - * + * the TelephonyManager (TM) or an already backed up EvenLog database... + *

+ * If you just need to add an event with currently connected TM data such + * as CID,LAC,PSC,GPS, then use the simple version called toEventLog(), + * defined below. + *

* Used in: AIMSICDDbAdapter.java (here) - * CellTracker.java - * SmsDetector.java - * + * CellTracker.java + * SmsDetector.java + *

* Issues: [ ] ALL events should be logged!! - * [ ] To avoid repeated copies, only check last DB entries - * [ ] Before inserting event, check that LAC/CID are not "-1". - * [ ] Any related notifications are better put here as well, right? - * [ ] - * + * [ ] To avoid repeated copies, only check last DB entries + * [ ] Before inserting event, check that LAC/CID are not "-1". + * [ ] Any related notifications are better put here as well, right? + * [ ] + *

* Description of EventLog DF_id: TODO: check and fix - * - * DF_id DF_desc - * --------------- - * 1 changing lac - * 2 cell no in OCID - * 3 "Detected Type-0 SMS" - * 4 "Detected MWI SMS" - * 5 "Detected WAP PUSH SMS" - * 6 "Detected WAP PUSH (2) SMS" - * 7 - * + *

+ * DF_id DF_desc + * --------------- + * 1 changing lac + * 2 cell no in OCID + * 3 "Detected Type-0 SMS" + * 4 "Detected MWI SMS" + * 5 "Detected WAP PUSH SMS" + * 6 "Detected WAP PUSH (2) SMS" + * 7 + *

* Notes: a) Table item order: - * - * time,LAC,CID,PSC,gpsd_lat,gpsd_lon,gpsd_accu,DF_id,DF_desc - * - * b) We need to check if cell is not in OCID Events are not continuously - * logged to the database as it currently stands. If the same cell shows - * up it will again be dumped to the event log and will fill up pretty - * quickly. - * - * @banjaxobanjo What do you mean here? ALL events should be logged! - * - * c) To select last lines use: - * - * SELECT * FROM EventLog WHERE LAC=30114 AND CID=779149 AND DF_id=1 ORDER BY _id DESC LIMIT 1; - * SELECT * FROM EventLog WHERE _id=(SELECT max(_id) FROM EventLog) AND LAC=30114 AND CID=779149 AND DF_id=1; - * - * - * Query examples for future devs: - * - * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id BETWEEN 1 AND 4 - * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 1" Changing LAC - * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 2" Cell not in OCID - * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 3" Detected SMS - * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 4" Unknown T.B.A... * + *

+ * time,LAC,CID,PSC,gpsd_lat,gpsd_lon,gpsd_accu,DF_id,DF_desc + *

+ * b) We need to check if cell is not in OCID Events are not continuously + * logged to the database as it currently stands. If the same cell shows + * up it will again be dumped to the event log and will fill up pretty + * quickly. + *

+ * banjaxobanjo What do you mean here? ALL events should be logged! + *

+ * c) To select last lines use: + *

+ * SELECT * FROM EventLog WHERE LAC=30114 AND CID=779149 AND DF_id=1 ORDER BY _id DESC LIMIT 1; + * SELECT * FROM EventLog WHERE _id=(SELECT max(_id) FROM EventLog) AND LAC=30114 AND CID=779149 AND DF_id=1; + *

+ *

+ * Query examples for future devs: + *

+ * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id BETWEEN 1 AND 4 + * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 1" Changing LAC + * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 2" Cell not in OCID + * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 3" Detected SMS + * SELECT * FROM EventLog WHERE CID = 1234 AND LAC = 4321 AND DF_id = 4" Unknown T.B.A... * */ public void insertEventLog(String time, int lac, @@ -2088,37 +2083,39 @@ public void insertEventLog(String time, String gpsd_lon, int gpsd_accu, int DF_id, - String DF_description){ + String DF_description) { - if (cid != -1 ) { // skip CID of "-1" (due to crappy API or roaming or Air-Plane Mode) + if (cid != -1) { // skip CID of "-1" (due to crappy API or roaming or Air-Plane Mode) // ONLY check if LAST entry is the same! String query = String.format( // "SELECT * FROM EventLog WHERE LAC=%d AND CID=%d AND DF_id=%d ORDER BY _id DESC LIMIT 1", "SELECT * from EventLog WHERE _id=(SELECT max(_id) from EventLog) AND CID=%d AND LAC=%d AND DF_id=%d", // was: "SELECT * FROM EventLog WHERE CID = %d AND LAC = %d AND DF_id = %d", cid, lac, DF_id); - Cursor cursor = mDb.rawQuery(query,null); + Cursor cursor = mDb.rawQuery(query, null); boolean insertData = true; - if (cursor.getCount() > 0) { insertData = false; } + if (cursor.getCount() > 0) { + insertData = false; + } cursor.close(); - if(insertData){ + if (insertData) { ContentValues eventLog = new ContentValues(); - eventLog.put("time",time); - eventLog.put("LAC",lac); - eventLog.put("CID",cid); - eventLog.put("PSC",psc); - eventLog.put("gpsd_lat",gpsd_lat); - eventLog.put("gpsd_lon",gpsd_lon); - eventLog.put("gpsd_accu",gpsd_accu); - eventLog.put("DF_id",DF_id); - eventLog.put("DF_description",DF_description); + eventLog.put("time", time); + eventLog.put("LAC", lac); + eventLog.put("CID", cid); + eventLog.put("PSC", psc); + eventLog.put("gpsd_lat", gpsd_lat); + eventLog.put("gpsd_lon", gpsd_lon); + eventLog.put("gpsd_accu", gpsd_accu); + eventLog.put("DF_id", DF_id); + eventLog.put("DF_description", DF_description); mDb.insert("EventLog", null, eventLog); Log.i(TAG, "InsertEventLog(): Insert detection event into EventLog table with CID=" + cid); - }else{ + } else { // TODO This may need to be removed as it may spam the logcat buffer... Log.v(TAG, "InsertEventLog(): Skipped inserting duplicate event into EventLog table with CID=" + cid); } @@ -2129,15 +2126,15 @@ public void insertEventLog(String time, // Defining a new simpler version of insertEventLog for use in CellTracker. // Please note, that in AMSICDDbAdapter (here) it is also used to backup DB, // in which case we can not use this simpler version! - public void toEventLog(int DF_id, String DF_desc){ + public void toEventLog(int DF_id, String DF_desc) { - String time = MiscUtils.getCurrentTimeStamp(); // time - int lac = CellTracker.mMonitorCell.getLAC(); // LAC - int cid = CellTracker.mMonitorCell.getCID(); // CID - int psc = CellTracker.mMonitorCell.getPSC(); // PSC [UMTS,LTE] + String time = MiscUtils.getCurrentTimeStamp(); // time + int lac = CellTracker.mMonitorCell.getLAC(); // LAC + int cid = CellTracker.mMonitorCell.getCID(); // CID + int psc = CellTracker.mMonitorCell.getPSC(); // PSC [UMTS,LTE] String gpsd_lat = String.valueOf(CellTracker.mMonitorCell.getLat());// gpsd_lat String gpsd_lon = String.valueOf(CellTracker.mMonitorCell.getLon());// gpsd_lon - int gpsd_accu = (int)CellTracker.mMonitorCell.getAccuracy(); // gpsd_accu + int gpsd_accu = (int) CellTracker.mMonitorCell.getAccuracy(); // gpsd_accu // skip CID/LAC of "-1" (due to crappy API, Roaming or Air-Plane Mode) if (cid != -1 || lac != -1) { @@ -2145,24 +2142,26 @@ public void toEventLog(int DF_id, String DF_desc){ String query = String.format( "SELECT * from EventLog WHERE _id=(SELECT max(_id) from EventLog) AND CID=%d AND LAC=%d AND PSC=%d AND DF_id=%d", cid, lac, psc, DF_id); - Cursor cursor = mDb.rawQuery(query,null); + Cursor cursor = mDb.rawQuery(query, null); // WARNING: By skipping duplicate events, we might be missing counts of Type-0 SMS etc. boolean insertData = true; - if (cursor.getCount() > 0) { insertData = false; } + if (cursor.getCount() > 0) { + insertData = false; + } cursor.close(); - if(insertData){ + if (insertData) { ContentValues eventLog = new ContentValues(); - eventLog.put("time", time ); // time - eventLog.put("LAC", lac ); // LAC - eventLog.put("CID", cid ); // CID - eventLog.put("PSC", psc ); // PSC [UMTS,LTE] - eventLog.put("gpsd_lat", gpsd_lat ); // gpsd_lat - eventLog.put("gpsd_lon", gpsd_lon ); // gpsd_lon - eventLog.put("gpsd_accu", gpsd_accu ); // gpsd_accu - eventLog.put("DF_id", DF_id); // DF_id + eventLog.put("time", time); // time + eventLog.put("LAC", lac); // LAC + eventLog.put("CID", cid); // CID + eventLog.put("PSC", psc); // PSC [UMTS,LTE] + eventLog.put("gpsd_lat", gpsd_lat); // gpsd_lat + eventLog.put("gpsd_lon", gpsd_lon); // gpsd_lon + eventLog.put("gpsd_accu", gpsd_accu); // gpsd_accu + eventLog.put("DF_id", DF_id); // DF_id eventLog.put("DF_description", DF_desc); // DF_desc mDb.insert("EventLog", null, eventLog); @@ -2182,47 +2181,44 @@ public void toEventLog(int DF_id, String DF_desc){ // Short sound: // TODO see issue #15 - } else { - // TODO This may need to be removed as it may spam the logcat buffer... - //Log.v(TAG, mTAG + ":toEventLog(): Skipped inserting duplicate event"); } +// else { + // TODO This may need to be removed as it may spam the logcat buffer... + //Log.v(TAG, mTAG + ":toEventLog(): Skipped inserting duplicate event"); +// } } // TODO This may need to be removed as it may spam the logcat buffer... //Log.v(TAG, mTAG + ":insertEventLog(): Skipped inserting bad CID/LAC data"); } - - /** * Description: Inserts BTS Sector Type data into the SectorType table - * + *

* Issues: - * [ ] - * + * [ ] + *

* Notes: - * */ - public void insertSectorType(String description){ + public void insertSectorType(String description) { ContentValues sectorType = new ContentValues(); - sectorType.put("description",description); + sectorType.put("description", description); mDb.insert("SectorType", null, sectorType); } /** * Description: Inserts SMS Detection Strings data into the "DetectionStrings" table - * + *

* Issues: - * [ ] - * + * [ ] + *

* Notes: - * */ - public void insertDetectionStrings(String det_str, String sms_type){ + public void insertDetectionStrings(String det_str, String sms_type) { ContentValues detectionStrings = new ContentValues(); - detectionStrings.put("det_str",det_str); - detectionStrings.put("sms_type",sms_type); + detectionStrings.put("det_str", det_str); + detectionStrings.put("sms_type", sms_type); String query = String.format( "SELECT * FROM DetectionStrings WHERE det_str = \"%s\" AND sms_type = \"%s\"", @@ -2230,7 +2226,7 @@ public void insertDetectionStrings(String det_str, String sms_type){ // Check that the new string is not already in DB then insert Cursor cursor = mDb.rawQuery(query, null); - if(cursor.getCount() <= 0) { + if (cursor.getCount() <= 0) { mDb.insert("DetectionStrings", null, detectionStrings); cursor.close(); } else { @@ -2239,12 +2235,12 @@ public void insertDetectionStrings(String det_str, String sms_type){ } /** - * Description: Inserts detected silent SMS data into "SmsData" table - * - * Issues: - * [ ] - * - * Notes: + * Description: Inserts detected silent SMS data into "SmsData" table + *

+ * Issues: + * [ ] + *

+ * Notes: */ public void insertSmsData(String time, String number, @@ -2257,34 +2253,34 @@ public void insertSmsData(String time, String rat, double gps_lat, double gps_lon, - int isRoaming){ + int isRoaming) { ContentValues smsData = new ContentValues(); - smsData.put("time",time); - smsData.put("number",number); - smsData.put("smsc",smsc); - smsData.put("message",message); - smsData.put("type",type); - smsData.put("class",CLASS); - smsData.put("lac",lac); - smsData.put("cid",cid); - smsData.put("rat",rat); - smsData.put("gps_lat",gps_lat); - smsData.put("gps_lon",gps_lon); - smsData.put("isRoaming",isRoaming); + smsData.put("time", time); + smsData.put("number", number); + smsData.put("smsc", smsc); + smsData.put("message", message); + smsData.put("type", type); + smsData.put("class", CLASS); + smsData.put("lac", lac); + smsData.put("cid", cid); + smsData.put("rat", rat); + smsData.put("gps_lat", gps_lat); + smsData.put("gps_lon", gps_lon); + smsData.put("isRoaming", isRoaming); // Check that SMS timestamp is not already in DB, then INSERT - if(!isTimeStampInDB(time)){ + if (!isTimeStampInDB(time)) { mDb.insert("SmsData", null, smsData); } } /** - * Description: This checks if a cell with a given CID already exists - * in the (DBe_import) database. - * - * Dependencies: CellTracker() + * Description: This checks if a cell with a given CID already exists + * in the (DBe_import) database. + *

+ * Dependencies: CellTracker() */ public boolean openCellExists(int cellID) { String qry = String.format("SELECT CID FROM DBe_import WHERE CID = %d", cellID); @@ -2294,38 +2290,38 @@ public boolean openCellExists(int cellID) { return exists; } - /** - * Description: Check if CID and LAC is already in DBi_bts - * - * NOTES: Warning, this is only for checking, if used to get info, - * replace "CID,LAC" with "*" - */ - public boolean cellInDbiBts(int lac,int cellID){ + /** + * Description: Check if CID and LAC is already in DBi_bts + *

+ * NOTES: Warning, this is only for checking, if used to get info, + * replace "CID,LAC" with "*" + */ + public boolean cellInDbiBts(int lac, int cellID) { String query = String.format("SELECT CID,LAC FROM DBi_bts WHERE LAC = %d AND CID = %d", lac, cellID); - Cursor cursor = mDb.rawQuery(query,null); + Cursor cursor = mDb.rawQuery(query, null); boolean exists = cursor.getCount() > 0; cursor.close(); return exists; } - /** - * Description: Check if CID (currently bts_id) is already in DBi_measure - * - * Issues: TODO: replace "bts_id" with DBi_bts:CID - * [ ] This is redundant because of cellInDbiBts - * - * Dependencies: TODO: where is this used? - */ - public boolean cellInDbiMeasure(int cellID){ + /** + * Description: Check if CID (currently bts_id) is already in DBi_measure + *

+ * Issues: TODO: replace "bts_id" with DBi_bts:CID + * [ ] This is redundant because of cellInDbiBts + *

+ * Dependencies: TODO: where is this used? + */ + public boolean cellInDbiMeasure(int cellID) { String query = String.format( // "SELECT CID FROM DBi_bts, DBi_measure WHERE bts_id = %d", // todo E:V:A "SELECT bts_id FROM DBi_measure WHERE bts_id = %d", cellID); - Cursor cursor = mDb.rawQuery(query,null); + Cursor cursor = mDb.rawQuery(query, null); boolean exists = cursor.getCount() > 0; cursor.close(); return exists; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java index 32e5b70b0..0d1c43ea3 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java @@ -91,7 +91,7 @@ private void checkForErrors() { String lineEnding = System.getProperty("line.separator"); FileWriter errorWriter = null; try { - File errorLogFile = new File(AIMSICDDbAdapter.FOLDER + "error.txt"); + File errorLogFile = new File(AIMSICDDbAdapter.mExternalFilesDirPath + "error.txt"); if (!errorLogFile.exists()) { errorLogFile.createNewFile(); } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java index a26b122b3..357b2dc02 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java @@ -388,7 +388,7 @@ protected void onPostExecute(String result) { if(lActivity != null) { final AlertDialog.Builder builder = new AlertDialog.Builder(lActivity); builder.setTitle(R.string.database_export_successful).setMessage( - lActivity.getString(R.string.database_backup_successfully_saved_to) + "\n" + AIMSICDDbAdapter.FOLDER); + lActivity.getString(R.string.database_backup_successfully_saved_to) + "\n" + AIMSICDDbAdapter.mExternalFilesDirPath); builder.create().show(); } } else { From eca9a027143fef4f6e690ce0c7682d34047b3fcf Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Tue, 17 Nov 2015 21:13:37 +0100 Subject: [PATCH 04/82] Fixed duplicate location reports, Closes #614 --- .../java/com/SecUpwN/AIMSICD/service/LocationTracker.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java index 5a8a53d3b..7a8fc9051 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java @@ -24,7 +24,7 @@ /** * Class to handle GPS location tracking */ -public class LocationTracker { +public final class LocationTracker { private static final String TAG = "LocationTracker"; // how long with no movement detected, before we assume we are not moving @@ -88,7 +88,7 @@ public boolean isGPSOn() { /** * Check if we are moving, using last known GPS locations * - * @return + * @return true if user has not moved in a while */ public boolean notMovedInAWhile() { // first-lock, assume no movement @@ -149,7 +149,7 @@ public GeoLocation lastKnownLocation() { * Our location listener, so that we can update our internal status before passing on the events * to the caller */ - private class MyLocationListener implements LocationListener { + private final class MyLocationListener implements LocationListener { @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @Override @@ -161,6 +161,7 @@ public void onLocationChanged(Location loc) { return; } + lastLocation = loc; lastLocationTime = System.currentTimeMillis(); extLocationListener.onLocationChanged(loc); } From 033cb87b8a8ac28bfa2c352efa403eefa8f0cf4c Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Wed, 18 Nov 2015 03:11:14 +0100 Subject: [PATCH 05/82] Gradle build fixed, ommiting missing translations while assembling release --- app/build.gradle | 1 + app/proguard-rules.txt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index d70ae97b2..de6db962d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -87,6 +87,7 @@ android { } lintOptions { + disable 'MissingTranslation' abortOnError false } diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt index cb8fe2d66..2da2bb052 100644 --- a/app/proguard-rules.txt +++ b/app/proguard-rules.txt @@ -73,3 +73,6 @@ public static final android.os.Parcelable$Creator *; } -dontwarn org.apache.** + +-keep class com.kaichunlin.transition.** { *; } +-dontwarn com.kaichunlin.transition.** From 3ebcdd9d715dd1b4d5ea89641749f95c3b64044f Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Thu, 19 Nov 2015 20:46:04 +0100 Subject: [PATCH 06/82] Fix for calling msgLong on background thread (no looper.prepare) --- .../com/SecUpwN/AIMSICD/utils/Toaster.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java index b09488a58..db8e2df44 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java @@ -47,20 +47,24 @@ public static void msgLong(final Context context, final String msg) { if (toast!=null){ toast.cancel(); } - - toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT); - new CountDownTimer(Math.max(TOAST_DURATION_MILLS - SHORT_TOAST_DURATION, 1000), 1000) { + new Handler(context.getMainLooper()).post(new Runnable() { @Override - public void onFinish() { - toast.show(); - } + public void run() { + toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT); + new CountDownTimer(Math.max(TOAST_DURATION_MILLS - SHORT_TOAST_DURATION, 1000), 1000) { + @Override + public void onFinish() { + toast.show(); + } - @Override - public void onTick(long millisUntilFinished) { - toast.show(); + @Override + public void onTick(long millisUntilFinished) { + toast.show(); + } + }.start(); } - }.start(); + }); } } /** From 0747dc56b5b986a822bb0ab07011f87cda7e54ac Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Thu, 19 Nov 2015 20:58:17 +0100 Subject: [PATCH 07/82] Update Gradle Wrapper to version 2.9 --- gradle/wrapper/gradle-wrapper.jar | Bin 49896 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 10 +++------- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8c0fb64a8698b08ecc4158d828ca593c4928e9dd..941144813d241db74e1bf25b6804c679fbe7f0a3 100644 GIT binary patch delta 46902 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 L1!dUzSL6Q&8czo! delta 43293 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�{>`y zax9Q*+L*RlV|JwSM^E6(^R44gTgGZ1Xb(n0p`E(jT&s%5Q0lrM#Nl`iOEY_~Eopm-;>v**FE($dmGq{MR`h~xnhz)31CJXCm8s~?38}lW| zfJdyW!;m&W){-up!N`2pi@WL#)HCkYG@Th<%rp&RcH+TJBHE$>SQ&=Y?h9lS%S&xWr?x&fw?rp;^xayoC z2^Rcy^}~kM&oi3A+Kzlb!;$$UvI3MbRJB=!UY>_FuRi`oX_~)Lw-1jtXYR&V2F)}} zjj0twuE(!r4MXqi$^!#Dm`sOah_bgwL-P9I-YfyH78jZbP2Asrts<4b6Ack0boJ4n zsVS*ZOXH>5AFej{fn}-xf-2@f1~P}Pf17UEQ&S5K5gt@sbU&J0^&}~)rueoelb@Q( zASzcE%|||T+iS+_Sk;HhTTiwK7Xz}La;NU;#TI4PDoE4V&D-`DX!OI5B0}FuQMB75 z&p#MnTXXFaxQKZG2b_iGbUA8f9;rR}CoO|Pm@k^Z<-D9{(VIBJkCP~XHZWC!_~S&RYaV4;+_*Hs zt&s0X&v-Lg8U32~HNIWJ3+DJX#}6uqwq+78xkOXG0gHS1mi58q>!s-xL_Pjh(9$oH z4&^E2^X>+Im;iC2)&5uB2yuSDrW?$SIKGL|Pbv|rH2x3dk5X_%%m(|0=Add4&fa~{ z^y|CUw?PPi`f-sxU4P%B;u3n{mF`X_KYz@|gpPGea3|=Q)jyGnkOEPYD`E^8*KD1g zJ5bH9IcK&mn$`4Jlvjd$h9XI}Y#8Anjx7Sk*pJQV*>L4?yGLz$5rDm~6(sV(q5gp_ zHRbI~)CUERTZ5t^PbN~0=-P$2sy0^YCYvakMg$9x5O6E4Gu;)8u^hC+$(5jc=Mc-& zyVsuj?)-;CJ~eY@Ljl%&Y9YPZ^djFcE;zUiXulfZ>>4(Maou$=i{2I>(Qu+2h1nc~ zBoK8X5)`OERB7JMnR#Tr+~>!ep=GBaW^)EcL1!y!V`BE3%6#}%_&}McBI&G0th1c> z@BuMFAuna>=SJ;aw9nW!Z3Vk1}0{b0K&*4zM*Q*H;#A3T6#5sWX^a2D3H=uN|XiU>{w> z^+K+rbU-6JoA8c4tTXVY&HvkxXcQ<>gTxkHdQKI|(Lj|jh7d|5ocGhJ9`3*uavtMn zo;d0yyndF{^ZW`=G@(qRN2XrS=Iq7YMDMbfXa9Ovv`^gQ-viT z93`n+c>a`g2mJudQ*atPn_w$G!Oq`*$WmA+9XbW(wS>QgUjnV;d&(NYz#!li5mT8a z2J*07^;xjs?Q+pM*Dc52AUg+&;gp-`L4Ko=lRjyRbACxd+$;z8u^WzG8r&ZP}p+S zvS(wji@4;60F$wIgVXgA82yR*`RlYZwLlVUwf`cuGoA0V>lOPiON*K> zr<3DcpEMnt_m6oY|YeCbC{2w^}J!Aff^!l{|am7Pa`oEQ-AY4tj4l39he36 zcwjp#x_(3D10^VAj+CsDw%V#x|CrbA?vI?8*o;2j>vcD@H~KtQQjS(VS~N}GWytB5 zfg;GQNhz+<1SLs`$5GStl(@jgszOC%0O5m9VGPmiAmWh`ANo1$j6Ev_f(_}TnCZW;x9g5D^y@r{ zBiqU_-*1X9|3!xWc^YwY5T(NU{Xmy;GFTN;!*B2<++!j{M-VHX)t ztM57xZA;vciW z-kxG!ucBQ?uiRZpufknRuf4uz%E?_W{K?YiEZ65B@|^0GvoUb~a-DL-G@b$5KK-&N zd3bjPSyH!H#%+VOW;>?uyL~BPcP%-)sv;}HRkXCq^-3IpFGy+%jQahSz*(cbKR?kn zyzqCi>kAKuRmzxrVTEN~ve%l`4iR}`i~RqTOfXHxlJy_Cs|ax7V$C^(_lw@SSj(X$ zm85HSDPyb^)GOkrwQ|o9slpl^yHcwX*KjMHr=>y&%~L)oS@LSCw>hbeJtT}dvfiw( zX4geD{N`dd{R^5uV8AGh4&1Y7!^&^=IzY8IWK=n@ufpe`8PfhuAqt1YKqZ};!lysW zj{x^W+`6WfK%&)9i&DZd{GXgk95+)5>mho$$5p|Tr3NoO@xTMD1~1Y7Cdh~yl8 zHU{l4>2I3kP^9}yX+udy8;vgqxcZUTp?UR(?JD>nQ}xMOk))X|5AX>vy@6Xs^~tR? zk)Y55*`UNrIj?R`kz zhE}CY&IzFF^UP8i1KQCw9vFcMv`1^OaOniR%>X`ya=4NjplYqyb`s;w_OV9c1L*Ro z!M0eQ;k85pxqcbRsTV55_f(AC2MQ_3Lez`a8W}_M$Ws&e>gBf6o8l-NRvBLdyhhc@ zv!ugC?F)!M*P-7ZUjc^?+W+1&6c#`=h@?sU0}En%E;_c@fo19{K=5$x5?9~L<1r@8 zp03^eRbce=n_fzeE&{kq_e=8S4(gmL^h^x44sIl6lYQnzm$9?1!z z#EO1erT{Vz@N|M*w6tAfq&zv(`SGiUshRpG<+Xz~Vk zK33(N7Y+*gQ>+|rWvl!DMiH!#zwdQFKtNQ$KtS04U)C9He62DW(6Z5D!OcBnZMAYY zT^KZA`olxk_BO~D$PoyVNfkct&yv5QJfsa48|ZOAZ!Z)MbggN^B&|9~~; zU72FL>q-0?$UhtH=`e-Xtn*M%l9l7! zq-?IIEXOIvE6>Z+x9YF;4}^a{?}9@hLO%u768hpM_0*mH7ea z``g1jRdDdesOZXCvok?soOvyId*RP}7Z z8}!!f4P#fOz7lQM@25^8l4`T(svuPsFWK)q{rjIjc$SW$T~SV-h$ZEY++8xtO(hU; zk1-1Ib_WSPv=ypnEh{&aOp)Pmv;>xmTM zTmn|_%?`6DR4Gey>I)8cOY@B0AnUtc`xiL`A4c1Q&OVq|N45Q&;<)O-vFto?6fYOuBzDuk zKjh_d86}a$Ahbd%i3`;Iw0Y@VQ6=9!V&7;Cd=A+WTOCMwECFCHN6q}XU?G%@eHfS+ zpSarARZ_-zTIM0Xa_NC8V%03~);~f!r@l(drB0Y@5@@URujJm4AQT!5(th|KvI9G) zADZ@K$E=ySO5nKWz#7D6k1Q&V&mZB7m#<(Mk@lipQ;5w0Pf8z~ZS?0tU)`N02$|iI zuq}*dnkryDGuw8?bt_7%h=!P`;RAD-(ci6+ohQmqz3u4dcwZ)VNvM6#i07Xr&-K3D zdh7pm?F9#AEnw+LsySJeoNt`G1nJ4Zzj9R>8{pqT@i0I-Zd3k zo>g5(g$dVdZHu3pAB&|wzVJp2QtI!FIY|e5E-qbQ57lf2_741N?bv(myc!Skw}4kf zxU~Y}eM0nkAfJk@Zvpl~52XvUG#0XsA_+7es`B)Xk`U54Wn3L$+hJ={QRxy^%+ET6 zURGhH#d`!{uR2>bommm}Cs{V(X&lDUGqEb^({^gqJw|Qd zWwnke{h|7;dL4GpmbYC5A}Z))3RK_E7e*5le2o)PY@}SU-^)+;N=B&K#oF4#>ULPN5Cf_o@3{S| z&PT8;PBeOq>E~5Q)mu0>-M}G&lSS@>jw%k_G!?T=D*si`PZFjYx;Z9vrA+jMRdfT9 zWgM{gZc_AI$>ocku#sn#xEL3Tl;3b0#Vf6zBA+z`Ff8F^DsBAb8q*w+`iI}|XR3;sEm(J{mVsr#1ov7iT z-K{L=jjOY7@Uh2iQrylYavG(p03u)D#g(~Z^2Ta|P zO{FxvWB>;_q2`Y`EOWhKj@Wa9`C+Sf5;XL;w<>5 zU1S4+7w!Z2e*>*Dw3wXyw+5hW{JAb4?g+WE9W}WEJ-s|VeKR9tEhD3foeM0SJpH#Y z;9$m^ zfgBG`g~ti@(3f|)Y^@SL*p8zN3Cg0XWbMHQeIm;+HfG_@cX7s}Qx;NT3r#mXIRG^V z4B6V)9tfspl-C{~zhN6t=L`J*Tblo-8Skb~1@}Mmy}Z>s`W6?8fsC)!X9p@<%Odk5 z_$2A*vX6zU<>m?eh<#jD_#<4<2u+A3PKjhL_U_i1brkz3QKg!|w`1EwM>5loza7mu zd70UGFGG&s#>Be@12bZReK#4<`PYhZ4)FIXkr@)Q|)F>1oR zO-!;z0ccjT-TN)l|Ke(FGAvK4U$bCUE}x9QXsS@$aB*rMruXJpS{d2$!e$d!DpLtJ z9z|Qw`X$Jz&7mT@ARyQn(Tmr5T`?e)eWQJ$wuA!{r?f_J7@7lOF$xT|Xm(E5w~vv- zj|JNi+~hAQ6gk3746;$9*xKy0MbwR9sJ}w zqYdmXy7J!b0aSfP=-f?U?U#^n`$+c31Wv(Is{fW^K-93?81^q6+Kf-KpDLR2HL#pn zW8wPYinWiP3QwE9Jb^2=Z3Y-#iWK-woJ~dDtS?%0S}a55IAl@mgBS`+k(xMkHMpXP zh3uC^sG?YyRh>q|o763ZHBJ zTRAl?-T=+7)=5FBt8~I5*AnPNwBybMeq`Y*%M@Z<(GkyI`<*XD6ms(DAw*&TQ>w6R_x9J3xNAD z9|il!8E>2N_y;gy%Ts1+g1E3~cj|(irG|j~6^T2KA^M-pG$v}C-e8y}5Y7Jjmp}WU zu`=m5`fwFKe6Q5o0QD(c54|NmR2tISZh#g3$>CW@YUoypJqIjeijZOGnGpWKtoP2H*3Ivzg%pZrV-_}#5otc3S6$GVAOK9?A=7mDtwfWf%Ht8irM4_P%o{(aF3O$ zuKNq_g#LTLK*Emt-5EyXrHf=!cx zSrB;2Xd86!l~MF-K*N9`!bvfFN9QU%C$zRu5&p54O=ymO<_vInf{4Y8q<-q!d>EY{B zd~ECT@fwO&vq3G6GSp`xJ{l<~NfAhz-%DlGC?>P0J?ZponiiwjPknUAj;~)qJ3hhd9SBVPqN*l6IHyiF%w3BJ=pKE9hvJl7osE&pU*}Vl&AlfSa1v^(FoTp+ z>uv5MIyN_4j@-i5WtX#TR-0@5)mK0dC-o1N27($}%-b!q|8I_ErNPn^@EuX!kiH%6 zJF3{mFE|mzqm1GJH`Fw}P*gF$vW?=^Nx`JiL1E3fntX}V$AUmAp+p2FNUX)C{}_aI zH^pz9nCLOpPmUv%G|x+FHa;1wH7tAN3e!-|n+S?gn6X%N@;#rI^Wl4)w7+^Y)u&6l z^pSesAB?+BzStbKUv)iYk6nQ*M|F=hL{#Pu#LR>mB1Me>p$G@a_Bv8J)H({>U%2iVJH>mwsVJR|8E7c){U@P-?xyL~V~U-bMI7m;iq zWZzA-x90{F?kz{^BFj-TU#c1BUt%3E2*95n`O^b!?J2F;?5U8pcO3PnVyZ5_wxE(k z!Gk)B(ST?1xy6L^6`;shuo7j%hBAAFSn@~$weEqdkR4QGx%(@aM2s6T6jXqy)In=v zf#f}=#2Xdj%I`iJ2ai&WnQQi?5Qbe9BOLbI2qldeuQ@`Q!Q6QNI&Y7k{W2mj*3U4;)cbF(W@#GOr zIO-%}TCU_yNF}Gw3}rW$m}@Z9oPMV?J$#*SPR^H)rNq493;wcaf$b9zor0pHQ*DhhOW@H z(`mN0EN-d0UO0o{4YdL1vJ3W$HfZ*X){pkyT+(UI8*zL0)blYBd)g z>pX)XvM5drxN#}>2V&r3@DvS+*E>EVmOmMS^YvhZdIH;} zmGNcUi*Joi0}e~f*Escw?*m?QjLUC~g_p3678gW=zuE_-M#JM<5#9Je!BGsK!11e?t!bHtTY45$qWk6 z8%4byZc?hK?|4@?w~)T+4!ZzR>0@)v=y+))3v9v<#5<(_P(kDGbmQ;U7zizUU`aZ@ zlcVE=P3bg;hx2sg)0W0ZpVK8YY+ELtX zXfO@wnXsI|Jt~bKHTi`DCHOG7P9V)$h`1pTPfww5?rYel zKsdv@C0OhVYd9PFqa!-fcNJ|Se}~jG&W{;d0ju597CU;Z83RGL6NEXhV?DAvxb9r= zoVIKL`!14y@gEIHMkgCBftJ}bS= zgaL5EA-ymc8dQlxn#{9-d7!pM!v-&^ae+%0S#Dv|R-^X7<OYh~B{gFiV3e~^GOG!kRA|FjaLXhuCf-K^m)US7HLL1Oh- zXmfHm!Yj0A0z|`q{0k{y>PXkkapbEh;i;Fj8R}nI{|psg`FmT%*RrLuyO1V4$noo= zc*^9An-jXMCBWLztiaAHjM)^?*halUNW(h?5qi|mZ0*C_3J=k5UoTmB2z-+^<=v%% zL{Y2XI%8;pp5hdjd5ZBXt{C%Q5Gdt%~~0UXYSgwXh9@Xt9@ByGaa zGjk;G0MZ+d*F4q;>H81L=dDU{FFxY0|0TKnU#|QW6qnsQFao19gG8t9UmegT%fip%S7+ zVQ%AN4L0h&HNB7{;H@V>V1{=Z^K~?+@QV5Lt?f=_jZK_MuBkk&wU`59D_Ek()3yb0 zvhjPWrZP{PZx&~w9v7n3NWD#wnPq7Kx>l_zGfly<0ZdV~tSA?usY)G^dmMYh-r4k) zGI*3gZ{^C3vE$^)2b2pvy4%dgkgLCXLS} zdF(8GO5j)xUS=U|UJ|8CU+L)@gl)K#<}-&3&F@Gb%&8g*gK+(WAR0uY*2Y%GOxO%Q zs@>KIA{{wZpbia6pNY|M-r*_9*aFScb%bFj&!gH;fk7x8#t2d4$UPBEm@gjmWLh+( zDE$(}lahh_H9rZ}xlRHoSPLNS)+_{SX7fIaE3_I$kmg=GX(mNZ_?({Hs^fvo<0NeH zAy?!;;S9`Cm3BOxepZ)lCo{MAy)z2J9*t=Gk5!5W;H(xQgLBX_8Il1;fh)Rd-4zCr zIvfbbp!GF$0aD;3eke8n+3h{W?h(RfEfX;;wh`u&*lrfQJ-*?7dSQ5EJaIwuu@ijnTqo(T8zL4K zZ{I9TLk}6kY^RQ0HxMfbNqxWJR66N66iNSRd9e-&OX_jVvy6Hv5Hlpw5PH!^_FG;b zn7L0*f6WFNIXp$BFo5wRVx<_Fc>Z*>Rf3Nkj0*kh|AHs|XXiVAv)s4h&s?Q|lCsG1 zD4&-Nb4e#4g?|RniSil*a}$EY2*QN&q4|*$z}qFcFhz@*j5w7){k{eQiMf%`ZKS_t z^03)#?p-maGG!zJUC=ovQ=jh9P{wT^n`RC859k-g;|o?N&Dq>U2y}73@{9OjEcn`{#Cw0z*U(IhxXXzX3`!#^I+sCq_}4 z0rp=Htp2)-5GlU(Lji_}B2DW-xq3pqVJLtXrqkl{5_`uXcEl>JRvRUvOw0{3L#;IE}W3b8lh++f`vq#l=O zna9D=H8% zL0uJ`$oGFQXX5YS1Fzqj3h}?bg?zsU2!DilyXar>GM)fnq>830vMR;~7z1+L4+Eut zlBi1b#0FNC$uJ9)VR>2=xpIXn!TZb+xQr)8yM@X4yWzH#blxS};ONekRlG0Ljjv>{ zf~%KIn7zbI=H6nH99u7wyq>@`3_OcVw$LO~ML za!LSrnX)~gTuXVH>rM_>aAXmse|X!AsXCp=CSkl$x+2gMd$0tg2 zDr?rJT~--dSAX5mE6C-o9$%zW$!P3qX+`u~mNX2Qr%?l&9O0*gpu^vxp-G`;Y3b2A z9FbSDoR>59PO?GE6o@I(DyOM0MVrtLlZPy_Vn<7UEc=E~jH`b}RfK`Bt%Q);5GGK@ zHfm7S)I@X+-b%)y2EL&+Z!K8WsW*R%;esKGt+Afhk`rYdZ`QBQqBh;fl%zeHXw_*J zrqu&vc8GVry)AM_FDk@=)q#0UqcdgU0oCVRW&ZuP*jfj76K8kW+)=~CgJsueXIU}P z7^>XqF;egAm(TrxW<2c`>;_~T+4tVq>~wam{~c%PQP`&U!ZcOjA8I@B$NJCx^(~bT zn~1f1WhzQN+h6ZilN4dX^i4r<>0*U|R--iFqG5N<VsQsP#Rm{ z87>a?etT!}4#w<#|Lvor$+_k=F8rr1S-RL%H8%?QQ040`nz5_l45QlmaBrrj>PpEr zl{^Ad$J6*NE9TbIq+$=bw-Ek#C|L)Kf=jT;)gr}>o$H(?k!UCRTPED0#E{T~gs_-n zRN!lSCry44d2)twGsGMWTmjh^71tq9?ExX^*|0XdTS~s5Kr?5XKoyt0A0Bp24gWB> z)A^`xlYKYxoM_1AFp8+pIjKDPSSVm`V4R9Pb?La}4kq&~#K>nb%2}vBT@G~|Z%at3 zhw1#NK(gm5WXjlw-^dC%6pp&{`KUTM;JDx32S4D{M|3(`2apquA{)2MF0KP4=w!Gw zY4JpY&LF6j3BweKI{OA)@^xPQxI71ui9LPGu*5lworBFaW#R#}83^uA zBx6f`-v8^jyr0JEWHL(d0;8cCf<4#TP4Vz|asg}4`kf^WXQTI|z}hH!IZ}|oCH~;v z`Y}a6oyN6YWTkh-x^VX{`%{HwFz-HY9Ap8Ps1s2EyAQQ(m(sO}y*&z;o-$~?zRg#I z$^9=wHto7#zz#lsJaM)vXo&)|WX^h#Vyj3-w1ZQ6Ck@hN)6z2zE8mN2OE9wIPr=<# z(jm=DTCx@Ml?OWakML_Gn~ z(W~2zzvpL4RYb9Kqqhg zSpA*dC*m* zoGrxHELWmYYSum4=v6IAPkb`%J84qDuVz`1!PBTSq2r{TAfJP(M5H#v8)8Hu4x2$v zfWU-jEL0mX7Jy~nJ*7PLh`FG=89I-7XegY^%4T3T>3p0!PXAOSTiM2@{#sdrPc@5m zAIJzmUpV~zHR&HxPH%=uqpX&#Vb6 zADMg0XJs)T2H8eMTc|B@gM0K(CZ!KhhertzovQ}=5DJzgQJ-)?*h|75 zdW-_ix=SyW%J2qRz?6FOlST&zQDoP=A*`{%is!&q&Qp$7(DavMRW!H0?==%4Og-Iy z0Sx7vp!nVC?!P_pPY7zf|Av;MA;kairv+NNe#6H$@|TA9dIo!;_J8Ih_!|@2;Wdyn z85%&%|Fu?-vIj`d_F(Pj)`?(7Ldm3?ZcWsSzY=)w^J_M1dx_P7Ce*F&Yu4Xl-_q#b zQb{~^GR2Wt;$$2&9%gx7wjO15UU3|aW`BNdeSzDteU=i2`h~f}5~8fqgGdf=zyjrM zZ^2N7VeM_}rlXL~T@r3up4llWDYalT$<2=cG~yoVm%HWRqSs&y#Z&r}*sn!1Tm4g{ z%vy{QAdE8Yf40Jz3cYdHzcH-6BfEH}uwwW~wYzpi?GD*X#(KRjcj@?x9ylRMsiQJ& zo~%7atNchO(;lTvDaT|#$!-f!(FT^YvzsRbqc%uu2FC5E;41da94;W*YA{O#@=x_# z2V9^){ECXDOY?UWw!9|nD@}O;d+ha-AC*-jxl7@;cT33P8jVtCkgO^$W5(yTZewn( zS4XzXaWc}e!!;bIP(nYBidtl|O0S{pRowc{1F8&utBg2^qFRkIW8k<*4*}T~nS&u^ zC_`{+?uww2%!nMxf6s42#z)Eq_Ziucv_ud6n>qufF1PdgO(#Vi!(v=ef=r&w}n z&5gzJMiYRiHr7evGm>BD!vt{akK(F0Qm#sw(FSAp{>W!9p8jp?ri`j$Y^F zwx{XiZ>}xs+#TGl(jL3I90&fHCOM8)wO+!ZI*49QBH(-Ph>@r&Z+fZ+YPC9;PQmfNHqGt%c@-I+X?h=NV3FD{~wE{SwQ_-o_22Aa^KOsDe{K36AiJv$+^@Gp=G^V#p!rR zD4AefH(=Auu04d;Az+d;6NR1V?&6KBer~0%=ek&n?GM9BO&7rtRZA{5`|@Wqe^(i| zd(e_nXXysQCx5T`ITPr2Ul|ko&`3CUq3R@>ROXu-Xll-_SyeNCPIc(3a(4A;kkOcGa@JZ*a6yF;|a zB}aMl`*Vi211wN7XA9#mKf*HZ{5@0$!SOO;0|k_csAKT14=XyN8!w*<^)B2eqtq>% zB?h$os9ek*b%1t8z2DhgJG<%1;?YxHyf<|F}-y>2sEVY61ZU z2?iH%$^rI)CaP%{9np5bk#*-|7}{O(KxY_Uk)e55r&*xMhn&%pvXi!`K#v?V>chpX zKwJ=ZkiiN(qWFM9>~|P7G&wmmm1N^{(u#T!w1q*m+NV1q_Nakgd)WwHQ;TZu z>qX=C)!`1Ubb~QJFMMD}RC^!s#t%a1V}50bK>RepC%b%OkkEZASqX-86M@@`EhqHF zG+c%kI{|{=5sN}noZ;|Ha1s!LYn>_zs?G+0RU_7YUrF2bJM2aFMv$ zcER+4o@H01t&XeO;4C61;dqWvt7@)9-2V-8vIIbVVqF3`Ga!kV#|2KtuowTzDT;Us zk_p_HiD~C)T;HHiG@i6+4>8-not>EKOFq*g2~{ytg*RLi(egIR$%g8mQRlqS|Fio? zp8v!{1$Mp<^Iu0G4M`Ur9~h|9+beHl~DN`LF#NLPGmU2t&&rRbmOWkUCzaq40yIz)1PM{F}+To(4U7hJaSr z%M8!Ubw|_g_t$6WKd{k?(>DZxsEx!m`AKVxkbzL29*5{Rp2F;*0Y|t?^-^PdV45l3nrQ*J_NF;yU58n89lc1Soc^2eu1=Ae z21hB`4s(Z5#xk)FFJh(A9GBt*+Qmh$sbJ$#z^BrBUmQ40wKveW^3B>~$cL8@gQd;O zOtPrSd2#9Bk-srE=68*4X~H|Ye*xv%<{aD@R3uoy_EYwlrWet!L9Zw2JPGHG+9hlHWlW2Nnz!qS1%b zKx@sYGic>(ea9X!1u*T*T+G|CV{xQ!g!gD3JUyKBi4d2+3#mF5FVX@0^k#fMp|qvK zca>X)jU$I~AhH z^cK`4F~e|f8ZZSSd_+FNa$$*@0g3&hznJ=dP*=0=fHlHTJeb_hXexbttPvglpi7^0 zYDTK=|6j>EPbGyY836=jo%B0BL;ZeRzyNA^>M1RxetD0KucxN}3iuPl?@OLbOi1__ zi7-GEs)QWcLI|+EN9u?SLCR!*`7`8UrA)bDfwusB?KP;WynR8!AY!UYx!H1QW1({6 z(gy$Rv9`R)vblYuslBe-@mtdj4;}d_I>Yhu`@uoy=*{Pd3vBCS`{W3O`g;Y1Zh(>t z@8uSs(kxeIZfpTh*HpMZ?;1zr-Dk@|-ynUF;HuZJY5kIstzEu_TcG)KX3!UH-_;Ey z?%a(i?!hxY>{od{5`Mx?K#r7jOY9gPp1p3vfoV3uA zpDnnSlVUraD@3dX_-vA3pST$J(sC%rOY?JxuGm#Y*>K24vO*qsjTROkfND31wUgq4 zLPbp6v?N-Er#4xy_^E3`D$EFVFeOF|zO5pCfSJrnk;J80p^n=!Sz9`;H|@GGqi&d@ zB0-OCY_z`7qKt2%ZDGrv1Ebr+(bL4&BwUKd6ADL!6Wn^l7irO?o>DGRl$u1X)AKeK z7LBs&g)}uh6;)<48(CU~=;u;7$kG}VGyON_%eNv#hxPmy(#15u@6xQsICGr4QyXsg zbw>YQf~uzOhbCHW8~PuH$)MpfodX%#A8? z8j6zL&#Op?l9-Z>Ku(Ca_R4*du$a6iVvq6VLKDWauDSTG`AhNz_B}x>$B&BsC8Gz4 z@`C+DbQzd;FpKc*^R&zXoeCP1gX`#hDB|F{tQ%RFN4-9wHK&}R(SRjmzeE-erS#I! zI=la>v^)3i(35G?*bBm~e`tSD;pxBMwXiWYAf=iqWj)COb@PPClg%)nNN4LLr3Z3} zH72}9LdAyg4zEwoow`yZ+IvE8a`6u!e<_mdxFV6D3k< z;)^op%_s4v{_Ki##+@%dyYZ?lp)lOSxOx96++tlj&*$0E`j$P1a9g(d%K#Z6gm*tK zMf_WZ5n1*USdkgcm#Gp4TEy_=iOa*pe89o1nb$-_xnT**Q2dx$%U}JQMuZSa^F~R* zdUgLX@nu=%LW*iJv?qa6K(-H~um8Y@DKT6eF5HoEt{^qdl#1qhs08|L*5~f89)H&a z8T8*%&~jOUrqwY3UC!gWw@EH#yx$!vvhJ^}Sual{pnQ>|r1a!xlMuDZ1A9fM-3%D< zdw?mbd@EF4qbGbSd51mP#rY4k(d{3rDor?0PVkS9W$_u>#Ag2WdHoM%k}0*9BQ=FG zm`#&wM2+m?`J}EiZUc=|Ql!ukT`8#5lX+ygIq5t+N!F^>YHdn2H72|3RR@7u4tgig zlZh5bz|{B^btNGqwF(95(OLX49Ay>hEd3c{d@I6E&)T!h&>karD&oNM`Y<(Wc>v&B zW)T*r{{q5hkOso0@4}A*b5j#i5zL?Bb(Qf=8!^oZ(@ow5<2mBo$lp`R5&ip78ElH_ zVuLx3ttL1s?VNGnp|$rP`VA`og3z#5f2w#1a3nEEi=;>)Pm_hmuL#T}ceYyD;259tTAs&+{c{>rS^Pcm~+PF&R+R$b5^zYQ{wzEr$_ zx@()Fh=6MJHi^gQ?u9BPVumV_I6S7UV^59Ww=lbmN)?qoiYm63qp?tH+~$%U;suk!W8a3H z=RP85;Ye;hAR|dX&ug;~hR1h$kRfYt+8XrSMt@4A0NOJ5c{&Xopp@@BvaB9ac+0UtI z>n*~6-BP&g{eh4%myxNrw2)N^4U|=Yq|B7L@o8}|z9K#i4%HPx<~vE^n57JB+?Ga_ z?&gM8aX&oh5Tgn+4RvalZtvraaqvmjYdr|(!e_Fy=(Je5^>HlGpOeWI@_QyYom*FXs6(g;3vadP&_E zx^U@BKqipv;)c2%f{fvgMqs8V_=J;AjyRp8?0X%yIV?KR_fyn^c7$mf*24dQf%ryR z)LosQxUU?4X3?|Ym(N#=$A+B!jZE5zk1+8u!jilCOvHO}Q~;p{x_MkS27SwpN6|H< zkB0l8{<$}teu3`Ig;sbkysSq50k^T|0@T0&5**>J{G`u#yX!O8NoB{w`P^L2k*+lH zcu8PeCpM({;MRGFb((+|kYzR`IF|7?wvDDdlEx;p|3v)zf>C>JHXCNN1xo1&VVx00 z-t^--Ux??4pe0ckNb-#G^?d6%2$|U>zyt8TT{$iMfBHJ>uqd1M?}JE4gT&I^-7Vc9 zU6M<;fTYAqO4pK0w{%KNcQ*)vq=a-Mg71p=Hy#{8G>O zPC$t_G!;z>$^4o*&AlqXJ@!Ihu3_HQ4-GW$wdjW#gSz>0OMA_?JKm9R-uqY%`RLgz8>^APM%} z_hLzo_s>5F1t_Sq(OzIBMCD{6&K?Ul#C{OS9zjQxsm>2NgcNwfPhpcB99u#>YC+#r zZEc3q2>T}FWE7c_(9D`Bjb21@X|-ny0MOAl%DO)wA##0F$0gRBW)l3VoHG>bqBk9= zD_?qDu>WeNY`b=5n)!lx7?*_a{pLbgax{>{jbTuW?~@-Y3f+_<*6vtb#0D;;Re>Vt8>FmN4tzc&%krPb(f3>DKJoCuV~>;zXG zQ@%Z!-{}@LGl?pavNO0fT7Q$|3**s7_D?*IA+nq1TNsbz56r67q9dTEM5eqx zxL4Jm5YL=NNmqBUXwx9mA5zyU)bW#F=GAc>lamIp@@kv`50TVL9j$oensUxR;8n&? zOMW?d`Sx{e(j9`V0KQnMaFiMGO||Yy$NaHd;vP+#5~+(T;H$~uXp+YXoo9kxvzT9a z|8ddzO_l|DU(OFpqxxo~EB=0v%BsH2gkC2>;>oLwBYq#Z4YAerIT6iuRdh!iy)S}0 zqq+H^y;wDk^Wa`E|6vXNvO;MX$>}GKGIiB?r7B%zOq*TPu}Xr@#pn=bNTjLZv-%jI zNMOy!&-3izXhGPPWhgYB%2CAhHg@QZ_PmU|X#;(O-hEdB1hm`ngI$ z`^)RDoT?Y$(dyFeb#;T4CeEcbdN%l~RqNJ#Dp6C5Hi>?TQOYW7U9`WdpNp#Nvofx5 z#xA>5pLWp;W*kHxYkX${v7U%TI2fW6pQs-Y_qh|+mAo(;x8N>_XIRmy?&cZFl3m$S zeB;WO*;wlb5F#57=-^4|zXXQ-qC(;tup?L*CRo7dtWyqgNe8xO`TK;5`;c{C3m_a~ z5aj>r!MqU&+!QI?AoGm!c~>Oe4}e`IVCb)P!OH|+cp5Dp2b`~gq(8^J9yaupZwpM` z(rTrw6;iV0Y#hTxx_>ItjkZ z7Ja5gEN{26oTvrS%Mv?I43vx}7`MiN=Jt-Jh=Ive4e<2I>Y=$#HZ5jQazDh0hsGUKUlX7NI|JvCxp|6I--LG zuWz%eib(lEs4bo;$ql!2tbXwR;g>9Kd5utq!@jO_o-g}Z-cNJht~lv9R_aXnB@!l9 zh`6t_WR?k_A1P`ss=LRkyD6lH&vTG~6emD%iYK&oP|q1&kQWNkF`RwZSD~Wnq{W%q zM$Zh)JuBfEEAnXk?ypX4>61j~EQ-d5KF>k2C^I0%n-?fm#G!9?zM39AS;ElWATB^f zRL>92RMRHY`(pI#%i^#j&*GYs&fLbZ^DL8J z@>7P;GhA=Pc7DM;-Z&9!a@AV^hRqcNfmEi&0R8RrQEsk*XgEDzQ3AwJ5^{1wIn;h) zjlh6+bEzT3`Wdr_w#~WM*gkCc6k!UvVQd}v7CsfFc{OnX9LjIU&%V6L+V(okv;*D$ zxP%kKQY6$=vXwI{Nv1aJtqY;H;HxN}T6SlmV*FVZdyfhTN%q6&`z63Xd>c zV<|-a!*-%?Srh85B4O8IKvTZ~RepLQCCmcW<-Ff6>({uuP=rY|0m!J>5Hb|VQ zMc-()*=l$WaCn@WC~X-huH9B)K8d2-`=r~H`L5cN<%>t|@NN__H;tJANXwZeLfXJ8 zML->cQ;E#tmf%~=3W;mrhDRbWcS8z8uu>wOtoyy=r+YF&+Qsl+5Jy>q=FV2_mX-tW z)~*be@9$#7;NgFm7E&yMR4;MlMO4kR;tFEwZu1$qEnVwTr1{#&t0hYU{N7$si8JX; zcF$#3yKN5eesPf{?SCg057LzxcSa4KfF~?Sj=x^8EFfnC3UsM1q6Rb5J?TSw`94zX zmH1@bZS>a5-yOkbfgJ+S5mlll)*Eil(U z!PLGNwN|Cwy6brlzQIbI6fgRH-mw=bZ z6T9h}004O()C=WbVsKm&e*fnL@89#mYJH}W$2d|RsJ<^tYck-^E-X}_tPxc@l zJ72HKnnrpQGD$2wy?(R3BJ}1^WP5C+K{TuV3H=6;Z7e4{o0fj5T8+kTFFq zC!1bLFXc0iV`%LgWJiX^QOs?>42s&i-mgy6YmT6012o^I@^P+n&(VoX0~b8|d31aN z+Ov#pL9Sq)5UJi$J=9&ArH@GsL_|ry0$%ec?QCi_)%N-7_o#7VIWEEm)>9JI52;?y zxUsaaACp&E&l{ZnY}UK-8m%5FF-ya(oLqHOuJatb>o|QQdqSPv?id_%kiC2CG2ANd zi*N=Cc9hV_nLow-0)*+V)z}qIRnZ%xymXgIsbQ~0ZJJ&M{P6r}3ol+F%qMxQa38tX zf~=+U$)Vj=q`G(Fy%3`kN@&R01dlm8`G_H!%}!6Nrn-|#w=f<+W>Hae5xNU?%dRm- z8ZDWluS0>56{yq+7c!Olfotd2_ey(vz1dh0aD6j%QhzMM`TN1XoCl_hD5}xo8f~{~ z@-RzluFhDR@^CrUvLm9PdYmQ1_LAChU@GQ&(O1H}uqpn*;ZTNYNJ10r+c$wY`JNjC?Qw|PxI*(*>}TaI8JwYb9pO4 z7Es6Otk?nStBEsGGvn;CBPyCMqam(Wm)U+DJMB?zW<+Ed0v7|X+G#M#wfNRMdo)7d zLh8alR9i zt)XI5t|U%GEVarj==OyNX_cLY3xtC75Aa; zd|yuf!ch`~^w_^E&Eb%mg|fSV(NtC{DaS&4n#Vi3lZ?R73iBIO>un-##?`H$s=XZI zk#In4BOy;!zBz}hv0_H@TVVlHKDHo*7kOuQ6R~zWANPP}MWe% zGOtMvxtk%Ib;LSSLyrSkkr6Vosln$pbS!w&wgfq$h9O5rkZ#%rL7TUBY(smOnUH#r z{HGc2u{}35!<+DAuQvs}O^LfBpygYc2H#65HNh}B0(h?Sl_^i&{gMPrU%%TSYD2IVMrPw@cL5XeXyiq z^h5kTMVv1r(;WxU2(mU%5C*QXV=R0?!IfTTQIYhl9O)$#5`7lXM<_bRoSuHg{0=)q z3tYb1U|+2UrlL&Xs&rxuev$V|T@)04M5JZY%y`QZ0&;!&1Ao@1N+;hwyN;)V&l}SUK zCk?rH4%^^WR*}#i^Q_nx-n2y+95Dkmq1dI99h?rPl za|p;fX!*3V>E)UE0i6IR=`~3kNcorUv-_DsF$uXuOx@_Di5lX999;>gjn5SnNHdp{ zR-XlIZwJr35Ie;_>l64-N0=mB?ujGLra8Z2Ii3=aKk`eYmL>j)R-UFpey52)Yoeto zKEEAg);*YQE7{^K3R1&ip>F6CxW`^ph>dXy2X0MaEfTc#Q@RNPGP^tsK|8n-88oiS z@Lm376SxJy9i+JzH5sR1(d1gB;lB*Y*@nxN%kkYAXKs~@7Fs1#j2aNRk8(kH_- zQo}V3=di}0B8(y)b*At-l+@mfBCE((kO=;IOUd5U+-585OKdLmpeptGl zW2|NLk0&-OE&`q{Z~Pl0WxS(hpDkZV@$!>qI8z=MriIc3bi>Md<^_Fj`Tn^G709|*vsOVJ)l+>%d>cgWSMvGx(@ucUi{(OX z7f7z{e#)t*y5SCdaW<8IesqNH+++-jpd(PJH#~YtSF5_vjD!ev*ndcWTv&2HrRzdr zG(5`^u#cN$>jC&S-sk1>f}8ylXgZO&&W>q2oud0odwM~*H>ybry3xUix}95Ip*QD3 zShk_n&i2Q}K)%dX3rC))c4m#Hv=YS(%dt|eZa1#s2v_H#F(=%u__k{{oy#(-+NA<_ zzY16Om#Nu&`7e*gFcG%G;Rf>!-i8O|Opu~Yn6t&{P)nuQbMkp3C7Bsxfrds&D1Q!C z!q2K_qDh)j$yKSLsxeColu!sE*Jb9*gz~eQjaV5`8Rt?qeP&aAQFlWbYsa(F`P}AA z$_aiW!KyL*S=Kg;FN-F{6#+1Jk7~G$;uO7@>cj06m|#!%2Wc2p&!w-V z5Ur3aio2gMsIcC+Jzs8}{M-|)1byz0@O+>65h4j53yK}Kd-v2s8qaA4FE z{OMqH4fj*cG)aPiHSn@<(Ce&C1)WZ`-S{hv6G}fX@q$xmNA#N)bP|+K=_cXZ3yK^? zE49?n1I5-`KCTa&E12$5?TGmFZA#XpkK6N0OrQ~L>EZ>DH-b2OQSCmeBKH-Go-Wg? z>%mdEr`om-D4V62CbkOE4ZvS~=#W=v<+oU2!sCjMJY((_eg-g}JokE@CnLNOr!v>3t3sx%>L-KVx>W(R_|w@LsJv=)23b49@+Wc8$1phqJT7VhCh4 z_8PC3f(Bn>k$Q{p`845_;5n^O7w!T!)o`%R4%Io!j*?K$D9(>cuDj{09ZB}|#K;X3 zIv0TD4=XmSc9HER6|0!bEPRkKTx_oh0bR9cB!q@QjoD?>T&|JcjDYOD)3YomA4Xax z;?gIVpj1?XWPu9QHO77(f_Z1jKK40*Q%=f-ReGl{rT|wzcES_Akg!$@o!OFdhk4hJ z>RdBCrAG532d%)p2JV)eB>@RzZl&&~9w)a&vU|ZUp4T3$E@8?DHlvGk1TT@gWonJ) z4whau$t20GlvsaM9_8(6wMcks7_w91H(qnW1PWPp3LkYDrVDgg=63TgFXSNvpt%zuc zlv#rYnl+VA!+g$2w(eST^II`(8C&b})UQ`rChDqQms}Dx9(d+UmPj!50Y7g7U5KR- zKewNg2lr2{OT`^ z>-HXHvR)?B^X%{`p~&Fw+}3IO(03m$&!N8Emh;x6`9|`Eev;&=3PQc8)wDRqEIB%BM&nbf0a|W zKYiT4f?2xE#)9)+KKHXaF>%br z32J2`4M+M=I4n6iwTOh0_ba?%ThLXk**@uG6@$iiJ^mQ0d6>2Cucm0#LutG%-K|zy z8*1VL7u;ie-O;rW$E(fq9P`8n+R)80+bPWVqMiqQ4hta#mJ`Vx9lOk2 z%~bEaZw09z%D`b|BH`|M)>!vhb*9ArqMupN_@vv@s(VddP$ZZGh!I(_cca>BX~XWG zc!LOBb6w~&iR~6Ag#9`wMMdAWf^Xw&CvnJe;Z#H5(2Y7la0J$n|LvOzU!h4ClAUh}% zQPmL1t$lgq6#Zj+g`Bq4;C|+renjxHb<)cKlNc#s{^{g~8l=v$NACBs;LghQ{NaRCHaO^kJ#H+0`%lf zc&8F@XipB;Nkd`hPsm~YLX~$SPIe%MTwyn#M$5Q+Bh?3TLwqGz{KJo3GcncB{^{;8{#NyH-~!XQ z6Y*GteKI>9(4Klt|02lwvO=sn0Z(E*IpcHc=dWWUqaz2EqF>wKLf4x@wFgG)q@?P^ z@#J~;dyzv(%&VZVcl?rh7cxu;l&GH=x<`h+GzM`s z1@tF2gQ`Ck>@+15mNJFwX^sN)RBW3qmAOVP=6Qe3cj0Xh?VG~cp=JifX%H+nns`|; zDjh6XLXx?ZS&seC2o64mn+WjP*-WXGU^AHiH?&Ipt8ADdYnPJlfO! z9X23-oFYDNdoKlBMk=5+$GMgwNBMbu0YUS-r;;t*LOO9%lw~@1#b{gQl=wIzY?ZGH z3%AV@*Ks=OG;+T1xfp zZ)W%@veCy%@g$9JV&$xOXUg0>>kX()f@NmICRVa|jaYL?hPRbIjkf5{e<;O2xPnI* z|BUOG{zQ2OL!25GDZfQTJWk zC9CVy;*gs?Hkv)M5pNW0yjxuKzB4Xp9yTp+P>M4|-!(1p2dwfjW)z}m=LLM`u?~0R zF?AM8I1x%7_1enwr?dy-*~2b)y4 z{7ev^r0IFT;dwk!dW&p&L_jq8yIZGQeg)8AFL!XC3bOmiKL0lvzm(pgj$kS$BUren z{r0TZvZGCyUGCb54v`cFRDzNO)&=-FeDaRZKW$)5%Hp)q3S#vFt~Hp#0lS~1iaN+_ z)J8lFbg3byp`iclc)SdX?vjP-+(<)jG8nM(Bn24If%{+G#d=PT|Es$w-$C&dO$aJT z=-9!9_WPIV##OAB&={=26&*Yv6zG4Tf51R{`iBeJ+y8T6!W@VfLw|qmVg>b#fqjAl z_s2EnzagOho&P7q=szK>T!7~G7XROX&!Ol)fq&b&{;kx^{9jAf0p^x@P;eG{Q$g?l zUHSe@uwegQTyTXB5_qH&hx~W4kXy&z;X!la1kHui|48U-zCXs3zc5J`57}>cdtdiW z3G~e+=uPf`?ci9d`Z~`&~%fj1Qnt zFYN>P=&;~Npg0>8146CB)6`}8*iuIvXqJrGaV0uT3-{0a6~?h^)v<593-E$~_q0eB2Z z2o@UnW8;q|;y;pzk6>6maCIaVIDFvwL#+QQB*MT5KLQW_fU5&^58xvWx<}xS0r+H$ z0V+vH`2ao$enGRQ2yL;C(>Z4hHBAhz7^Hdt|0}Zfzew}_?SSBuLB$8?LCymj(-O4p z^Zk#2zUKQY*gTlMb;ShlkNnB?gC+tLc7!%<(MPb0J-Bm7`60&txR3wE^8G7bKco-p zM-Fc4`xE1X_arnkh0tLL|6laC`F+<1^QFUoYUf{&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` From 2d8c219759336ffdbddd8800095a45850729a040 Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Thu, 19 Nov 2015 21:09:38 +0100 Subject: [PATCH 08/82] Changed versioning from manually editing AndroidManifest.xml to using current commitId in abbreviated form --- app/build.gradle | 6 ++++-- app/src/main/AndroidManifest.xml | 2 +- build.gradle | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index de6db962d..a5f8a7e7d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,7 +19,7 @@ def getManifestVersionCode() { def matcher = pattern.matcher(manifestText) matcher.find() def version = Integer.parseInt(matcher.group(1)) - println sprintf("Returning version %d", version) + println sprintf("Returning version code %d", version) return version } @@ -31,7 +31,9 @@ def getManifestVersionName() { def matcher = pattern.matcher(manifestText) matcher.find() def zname = matcher.group(1) - println sprintf("Returning version %s", zname) + def git = org.ajoberstar.grgit.Grgit.open(file('..')) + zname += "-" + git.head().abbreviatedId + println sprintf("Returning version name %s", zname) return zname } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8812c6919..b309e2eb6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" package="com.SecUpwN.AIMSICD" android:versionCode="36" - android:versionName="0.1.36-alpha-b00"> + android:versionName="0.1.36-alpha"> - - - - - - @@ -65,10 +59,6 @@ - - - - From ad0722d829c2b43339d41f541edc6c1da9fc740c Mon Sep 17 00:00:00 2001 From: Olexandr Nesterenko Date: Sun, 22 Nov 2015 14:48:41 +0100 Subject: [PATCH 14/82] Translated using Weblate (Ukrainian) Currently translated at 57.7% (171 of 296 strings) --- .../res/values-uk/translatable_strings.xml | 194 +++++++++++++++++- 1 file changed, 192 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uk/translatable_strings.xml b/app/src/main/res/values-uk/translatable_strings.xml index a6b3daec9..4fda80480 100644 --- a/app/src/main/res/values-uk/translatable_strings.xml +++ b/app/src/main/res/values-uk/translatable_strings.xml @@ -1,2 +1,192 @@ - - \ No newline at end of file + +Слідкування + Подробиці Телефон/SIM + Перегляд карти антен + Перегляд бази даних + Вихід + Гаразд + Скасувати + Я погоджуюся + Я не погоджуюсь + + ВІДМОВА ВІД ВІДПОВІДАЛЬНОСТІ + Перемикач виявлення атаки + Перемикач слідкування за стільниками + Створити резервну копію БД + Очистити/скинути БД + Всі дані будуть стерті.\nПродовжити? + Відновити базу даних + Параметри + Натисніть ще раз для виходу. + Всі поточні відомості про стільник + Зневадження + Відсутнє з\'єднання з інтернетом + Завантажити дані базових станцій + + Інформація про пристрій + Інформація про SIM + Інформація про мережу + Поточний рівень загрози + Індикатор шифрування + Країна: + ID оператора: + Назва оператора: + IMSI: + Тип телефону: + IMEI: + Версія RIL: + Ім\'я постачальника: + Код постачальника: + Тип: + Роумінг: + TA (LTE): + Оновити + PSC: + + Вивантажити дані базових станцій + + Про AIMSICD + Версія:  + AIMSICD на GitHub + Документація (WIKI) + Очікування/Завантаження. + Все гаразд. + ID мережі: + ID системи: + ID базової станції: + + Системні налаштування + Автоматичний запуск + Автоматичний запуск сервісу під час завантаження + Постійний сервіс + Налаштування захисту + Налаштування сповіщення + (Наразі лише CMDA телефони) + Налаштування інтерфейсу + Піктограми стану + Вибір схем піктограм + Період оновлення + Налаштування OpenCellID + Ключ OpenCellID API + Моніторинг стільників + Налаштування перегляду карти + Тип карти + Показувати карту в різних стилях + + "CID: " + "LAC: " + "MCC: " + "MNC: " + "PC: " + "Зразки: " + Дані OpenCellID + "Широта: " + "Довгота: " + + Оберіть таблицю + Успішно експортовано + + Відповідь: + Виконання + Виявлені пристрої: + Затримка часу: + Оберіть затримку часу + Ключ OpenCellID API + "Трапилась помилка під час отримання ключа: " + Збережено новий ключ API. + + Очистити + Копіювати + Зупинити + Почати + + "При використанні AIMSICD ви розумієте та погоджуєтесь, що AIMSICD є експериментальним та інформаційним Android додатком (далі ПО), яке може і не виявити стеження та відслідковування за різними причинами. Ви також розумієте, що додаток можна обійти чи ввести в оману за допомогою інших засобів, які ще не зрозумілі розробникам. Таким чином, ви також погоджуєтесь і розумієте, що розробники та компанії, які пов\'язані з даним ПЗ ні в якому разі не можуть нести відповідальність за результати роботи ПЗ чи результати, які залежать від використання даного ПЗ, а також не несуть ніякої відповідальності за інші збитки (включаючи, без обмежень, у вигляді недоотриманого прибутку, призупинення ділової активності, втрату ділової інформації та інші конкретні збитки), які можуть статися через використання чи неможливість використання ПЗ, також в тому випадку, якщо розробники та компанії, пов\'язані з цим ПЗ, були попереджені про можливість такого збитку. " + + Не вдається завантажити OpenCellID дані без інтернету, будь ласка, з\'єднайтеся із мережею для передачі даних! + + Підсумок: + Код місце-розташування: + ВНЕСОК + ВІДМОВА ВІД ВІДПОВІДАЛЬНОСТІ + РЕЛІЗИ + Перелік змін + Вас відстежують! + Небезпечна зона обслуговування. Залиште її! + Тікай! Маніпулюють телефоном! + Натисніть на піктограму стану для отримання більш детальної інформації: + + Визначення координат вимкнуто + Ви не можете відслідковувати данні GPS без сервісу визначення координат. Увімкнути його зараз? + + Сервіс буде продовжувати роботу після виходу з додатку (зніміть прапорець «закрити повністю») + Отримання OpenCellId API ключа... + + Видалено + Не вдалося видалити + Сусідні стільники + CID: + ЛІЦЕНЗІЯ + Активність даних: + Стан даних: + Відкрити меню навігації + Закрити меню навігації + Проект на основі Android, для виявлення і уникання фальшивих базових станцій (IMSI-перехоплювачі) у GSM/UMTS мережах. + Слідкування за стільниками + Увімкнути автоматичне слідкування за стільниками + Виявлення фемтоточок + Захист від фемтоточок + Примусово вмикати режим «у літаку» при виявлені фемтоточки (підключення до мережі виконується вручну) + Контроль за частотою оновлення пристрою\nПоточний вибір: %s + Введіть Ваш OpenCellID API ключ тут + Увімкнути автоматичний моніторинг стільників + Запит ключа OCID API + Запит API ключа для доступу до OpenCellID даних + + Командний інтерфейс AT + Введіть AT команду тут. + + Виявлено безшумну SMS + Безшумну SMS виявлено!\nПодробиці: Дивіться в базі даних. + Таблиця не містить жодних даних для показу. + + Звіт зневадження + Звіти скопійовано до буферу обміну. + Скасувати + Гаразд + + Увімкнути вібрацію + Вібрувати при зміні сповіщення + Оберіть послідовний пристрій + Натисніть «Гаразд», аби надіслати запит API ключа з OpenCellID.org. Це дозволить вам завантажувати звідти дані тапереглядати їх на карті. Це також дозволить вам вивантажувати свої дані по стільникам. Зауваження: якщо на протязі 20 днів ви не вивантажуєте свої дані, ваш API ключ буде деактивовано. + ДОКЛАДНЕ ПОЯСНЕННЯ + 2 сек + 5 сек + 10 сек + 25 сек + 45 сек + 1 хв + 5 хв + 2 сек + 5 сек + 10 сек + 20 сек + 30 сек + 10 хв + Налаштування + Додаток + Моніторинг стільникової інформації. + Моніторинг стільникової інформації призупинено. + Відслідковування стільникової інформації. + Відслідковування стільникової інформації призупинено. + Лише один запит на добу!\nБудь ласка, спробуйте пізніше. + ID стільника відсутнє в базі даних OCID! + Тип телефону + Оновлювати кожні + Оновити зараз… + секунд. + Запит даних із OpenCellID…\nЦе може зайняти хвилину. + Невдалося визначити місце розташування.\nУвімкніть сервіс визначення місце розташування і спробуйте ще раз. + OpenCellID дані успішно отримано.\nМаркери карти оновлено. + Стан: + Поточний послідовний пристрій: + From cd96a50a4a8836d7c710d64746c05fe60d98ebfb Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Mon, 30 Nov 2015 17:21:56 +0100 Subject: [PATCH 15/82] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100% (0 of 0 strings) Created new translation. --- app/src/main/res/values-nb/translatable_strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-nb/translatable_strings.xml diff --git a/app/src/main/res/values-nb/translatable_strings.xml b/app/src/main/res/values-nb/translatable_strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-nb/translatable_strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From aa0bf1eb1c725757de7e90a4472af0d3704b48ef Mon Sep 17 00:00:00 2001 From: Arian Sameni Date: Wed, 2 Dec 2015 12:28:56 +0100 Subject: [PATCH 16/82] Translated using Weblate (Spanish) Currently translated at 100.0% (296 of 296 strings) --- .../main/res/values-es/translatable_strings.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/src/main/res/values-es/translatable_strings.xml b/app/src/main/res/values-es/translatable_strings.xml index 210205bc8..eaaeca4a5 100644 --- a/app/src/main/res/values-es/translatable_strings.xml +++ b/app/src/main/res/values-es/translatable_strings.xml @@ -314,4 +314,20 @@ Llave OpenCellId Invalida, Intente de nuevo mas tarde. Obtener llave API de OpenCellId... + Ajustes de Notificación + Habilitar Vibración + Vibrar cuando la notificación cambie + Vibrar por nivel de amenaza + Seleccionar nivel mínimo de amenaza en el que vibrar + En reposo + Normal + Medio + Alarma + + Borrado + Error al borrar + La cadena fue añadida a la base de datos + Error al añadir la cadena a la base de datos + + "Cadena no añadida\nLas comillas dobles \" no están soportadas " From 98643efd46699c3f1feb2067d9ab3e09a71e4baa Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 3 Dec 2015 20:10:02 +0100 Subject: [PATCH 17/82] Delete activity_open_cell_id.xml This file seems unused and therefore useless --- res/menu/activity_open_cell_id.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 res/menu/activity_open_cell_id.xml diff --git a/res/menu/activity_open_cell_id.xml b/res/menu/activity_open_cell_id.xml deleted file mode 100644 index 676c062de..000000000 --- a/res/menu/activity_open_cell_id.xml +++ /dev/null @@ -1,6 +0,0 @@ -

- - From 17f96c58794243c52978a6dcc7547e34490b8a68 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 3 Dec 2015 20:58:49 +0100 Subject: [PATCH 18/82] improve the Version calculation --- app/build.gradle | 43 +++----------------------------- app/src/main/AndroidManifest.xml | 4 +-- build.gradle | 3 +-- 3 files changed, 5 insertions(+), 45 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5f8a7e7d..e6372cb02 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,43 +1,6 @@ -import java.util.regex.Pattern - apply plugin: 'com.android.application' -//====================================================================== -// TODO: (There must be a simpler way to do this!) -// These will import versionCode and versionName from AndroidManifest.xml -// Most important is that these function names are unique. -// versionCode can auto update the version number. -// Then put this function inside the defaultConfig { ... }} -// See: http://tinyurl.com/kuu2rve -//====================================================================== - -def getManifestVersionCode() { - println "Importing with getManifestVersionCode()" - def manifestFile = file("src/main/AndroidManifest.xml") - def pattern = Pattern.compile("versionCode=\"(\\d+)\"") - def manifestText = manifestFile.getText() - def matcher = pattern.matcher(manifestText) - matcher.find() - def version = Integer.parseInt(matcher.group(1)) - println sprintf("Returning version code %d", version) - return version -} - -def getManifestVersionName() { - println "Importing with getManifestVersionName()" - def manifestFile = file("src/main/AndroidManifest.xml") - def pattern = Pattern.compile("versionName=\"(.+)\"") - def manifestText = manifestFile.getText() - def matcher = pattern.matcher(manifestText) - matcher.find() - def zname = matcher.group(1) - def git = org.ajoberstar.grgit.Grgit.open(file('..')) - zname += "-" + git.head().abbreviatedId - println sprintf("Returning version name %s", zname) - return zname -} - -//====================================================================== +def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim() android { compileSdkVersion 21 @@ -46,8 +9,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 19 // Do not change: Working Icons on Android 5+ - versionCode = getManifestVersionCode() - versionName = getManifestVersionName() + versionCode 36 + versionName '0.1.36-alpha-' + gitSha testApplicationId "com.SecUpwN.AIMSICD.test" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b309e2eb6..e710f0006 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,9 +1,7 @@ + package="com.SecUpwN.AIMSICD"> @@ -29,11 +29,11 @@ Angriffserkennung\nein/ausschalten Funkzellen aufzeichnen Datenbank sichern - Datenbank löschen + Datenbank löschen / zurücksetzen Alle Daten werden gelöscht.\nSind Sie sicher? Datenbank wiederherstellen Einstellungen - Erneut drücken zum verlassen. + Erneut drücken zum Verlassen. Derzeitige Funkzellen Fehlerbehebung Keine Internetverbindung @@ -202,7 +202,7 @@ Flach - Sense + Sinn Weiß Gelände Normal @@ -396,4 +396,12 @@ Zeichenkette zur Datenbank hinzugefügt Hinzufügen der Zeichenkette zur Datenbank fehlgeschlagen + Vibration an + Vibriere bei Benachrichtigungs-Wechsel + Benachrichtigungs-Einstellungen + Ruhezustand + Normal + Mittel + Alarm + From 603decc3ff9c0f6edda6bacd111769a75af31299 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Sun, 6 Dec 2015 15:07:00 +0100 Subject: [PATCH 27/82] use targetSdk 19 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index cc6e48fed..17e8c4370 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { defaultConfig { minSdkVersion 16 - targetSdkVersion 22 // Do not change: Working Icons on Android 5+ + targetSdkVersion 19 // Do not change: Working Icons on Android 5+ versionCode 36 versionName '0.1.36-alpha-' + gitSha testApplicationId "com.SecUpwN.AIMSICD.test" From 0dc10b92b11157977ee1997b39c4e03cbac52f1f Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 00:03:04 +0100 Subject: [PATCH 28/82] use okhttp instead of Apache HttpClient --- app/build.gradle | 2 +- .../java/com/SecUpwN/AIMSICD/AppAIMSICD.java | 10 ++ .../activities/OpenCellIdActivity.java | 29 +++-- .../SecUpwN/AIMSICD/utils/RequestTask.java | 107 +++++++----------- 4 files changed, 69 insertions(+), 79 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b2a1360ec..993588c0e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,7 +118,7 @@ dependencies { compile 'org.osmdroid:osmdroid-android:4.2' compile 'org.slf4j:slf4j-api:1.7.12' compile 'eu.lp0.slf4j:slf4j-android:1.7.12-0' - compile 'org.apache.httpcomponents:httpmime:4.2.1' + compile 'com.squareup.okhttp:okhttp:2.6.0' compile 'au.com.bytecode:opencsv:2.4' compile files('libs/osmbonuspack_v5.1.jar') compile 'com.nineoldandroids:library:2.4.0' diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java b/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java index 294c78158..29e4ecd51 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java @@ -14,6 +14,8 @@ import com.SecUpwN.AIMSICD.constants.TinyDbKeys; import com.SecUpwN.AIMSICD.utils.BaseAsyncTask; import com.SecUpwN.AIMSICD.utils.TinyDB; +import com.squareup.okhttp.Cache; +import com.squareup.okhttp.OkHttpClient; // DO NOT REMOVE BELOW COMMENTED-OUT CODE BEFORE ASKING! //import com.squareup.leakcanary.LeakCanary; @@ -24,6 +26,8 @@ public class AppAIMSICD extends Application { final static String TAG = "AIMSICD"; final static String mTAG = "AppAIMSICD"; + private OkHttpClient okHttpClient; + /** * Maps between an activity class name and the list of currently running * AsyncTasks that were spawned while it was active. @@ -41,6 +45,8 @@ public void onCreate() { //LeakCanary.install(this); TinyDB.getInstance().init(getApplicationContext()); TinyDB.getInstance().putBoolean(TinyDbKeys.FINISHED_LOAD_IN_MAP, true); + + okHttpClient = new OkHttpClient(); } public void removeTask(BaseAsyncTask pTask) { @@ -113,4 +119,8 @@ public void attach(Activity activity) { } } } + + public OkHttpClient getOkHttpClient() { + return okHttpClient; + } } \ No newline at end of file diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java index 43db6d8a1..b11dc25c1 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java @@ -12,16 +12,14 @@ import android.util.Log; import android.view.View; +import com.SecUpwN.AIMSICD.AppAIMSICD; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.service.AimsicdService; import com.SecUpwN.AIMSICD.service.CellTracker; import com.SecUpwN.AIMSICD.utils.Helpers; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.util.EntityUtils; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; import java.io.IOException; @@ -42,12 +40,18 @@ public class OpenCellIdActivity extends BaseActivity { private static final String TAG = "OpenCellIdActivity"; private ProgressDialog pd; + //TODO: @Inject + private OkHttpClient okHttpClient; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_open_cell_id); prefs = getSharedPreferences(AimsicdService.SHARED_PREFERENCES_BASENAME, 0); + + //TODO: Use a dependency injection for this + okHttpClient = ((AppAIMSICD)getApplication()).getOkHttpClient(); } public void onAcceptedClicked(View v) { @@ -148,13 +152,16 @@ private boolean isKeyValid(String key) { * @return null or newly generated key */ public String requestNewOCIDKey() throws IOException { - HttpGet httpRequest = new HttpGet(getString(R.string.opencellid_api_get_key)); - HttpClient httpclient = new DefaultHttpClient(); - HttpResponse response = httpclient.execute(httpRequest); + Request request = new Request.Builder() + .get() + .url(getString(R.string.opencellid_api_get_key)) + .build(); + + Response response = okHttpClient.newCall(request).execute(); - int responseCode = response.getStatusLine().getStatusCode(); + int responseCode = response.code(); - String htmlResponse = EntityUtils.toString(response.getEntity(), "UTF-8"); + String htmlResponse = response.body().string(); // For debugging HTTP server response and codes Log.d(TAG, "Response Html=" + htmlResponse + " Response Code=" + String.valueOf(responseCode)); diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java index 357b2dc02..2a33bafcf 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java @@ -13,36 +13,27 @@ import android.util.Log; import com.SecUpwN.AIMSICD.AIMSICD; +import com.SecUpwN.AIMSICD.AppAIMSICD; import com.SecUpwN.AIMSICD.BuildConfig; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.activities.MapViewerOsmDroid; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; import com.SecUpwN.AIMSICD.constants.TinyDbKeys; import com.SecUpwN.AIMSICD.service.CellTracker; - -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.entity.mime.MultipartEntity; -import org.apache.http.entity.mime.content.InputStreamBody; -import org.apache.http.entity.mime.content.StringBody; -import org.apache.http.impl.client.DefaultHttpClient; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.MultipartBuilder; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; /** * @@ -125,6 +116,8 @@ public RequestTask(Context context, char type) { @Override protected String doInBackground(String... commandString) { + OkHttpClient okHttpClient = ((AppAIMSICD)getActivity().getApplication()).getOkHttpClient(); + // We need to create a separate case for UPLOADING to DBe (OCID, MLS etc) switch (mType) { // OCID upload request from "APPLICATION" drawer title @@ -137,39 +130,27 @@ protected String doInBackground(String... commandString) { File file = new File((mAppContext.getExternalFilesDir(null) + File.separator) + "OpenCellID/aimsicd-ocid-data.csv"); publishProgress(25, 100); - MultipartEntity mpEntity = new MultipartEntity(); - FileInputStream fin = new FileInputStream(file); - String csv = Helpers.convertStreamToString(fin); - - mpEntity.addPart("key", new StringBody(CellTracker.OCID_API_KEY)); - mpEntity.addPart("datafile", new InputStreamBody( - new ByteArrayInputStream(csv.getBytes()), "text/csv", "aimsicd-ocid-data.csv")); - - ByteArrayOutputStream bAOS = new ByteArrayOutputStream(); - publishProgress(50, 100); - mpEntity.writeTo(bAOS); - bAOS.flush(); - ByteArrayEntity bArrEntity = new ByteArrayEntity(bAOS.toByteArray()); - bAOS.close(); - bArrEntity.setChunked(false); - bArrEntity.setContentEncoding(mpEntity.getContentEncoding()); - bArrEntity.setContentType(mpEntity.getContentType()); - - HttpClient httpclient; - HttpPost httppost; - HttpResponse response; - - httpclient = new DefaultHttpClient(); - httppost = new HttpPost("http://www.opencellid.org/measure/uploadCsv"); - publishProgress(60,100); - httppost.setEntity(bArrEntity); - response = httpclient.execute(httppost); + RequestBody requestBody = new MultipartBuilder() + .type(MultipartBuilder.FORM) + .addFormDataPart("key", CellTracker.OCID_API_KEY) + .addFormDataPart("datafile", "aimsicd-ocid-data.csv", RequestBody.create(MediaType.parse("text/csv"), file)) + .build(); + + Request request = new Request.Builder() + .url("http://www.opencellid.org/measure/uploadCsv") + .post(requestBody) + .build(); + + publishProgress(60, 100); + + Response response = okHttpClient.newCall(request).execute(); + publishProgress(80,100); if (response!= null) { Log.i(TAG, "OCID Upload Response: " - + response.getStatusLine().getStatusCode() + " - " - + response.getStatusLine()); - if (response.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) { + + response.code() + " - " + + response.message()); + if (response.code() == 200) { mDbAdapter.ocidProcessed(); } publishProgress(95, 100); @@ -185,8 +166,6 @@ protected String doInBackground(String... commandString) { Log.e(TAG, "Upload OpenCellID data Exception", e); } catch (FileNotFoundException e) { Log.e(TAG, "Upload OpenCellID data Exception", e); - } catch (ClientProtocolException e) { - Log.e(TAG, "Upload OpenCellID data Exception", e); } catch (IOException e) { Log.e(TAG, "Upload OpenCellID data Exception", e); } catch (Exception e) { @@ -199,7 +178,7 @@ protected String doInBackground(String... commandString) { case DBE_DOWNLOAD_REQUEST_FROM_MAP: // OCID download request from "Antenna Map Viewer" int count; try { - int total; + long total; int progress = 0; String dirName = getOCDBDownloadDirectoryPath(mAppContext); File dir = new File(dirName); @@ -209,17 +188,16 @@ protected String doInBackground(String... commandString) { File file = new File(dir, OCDB_File_Name); Log.i(TAG, "DBE_DOWNLOAD_REQUEST write to: " + dirName + OCDB_File_Name); - URL url = new URL(commandString[0]); - HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); - urlConnection.setRequestMethod("GET"); - urlConnection.setConnectTimeout(mTimeOut); - urlConnection.setReadTimeout(mTimeOut); // [ms] 80 s - urlConnection.setDoInput(true); - urlConnection.connect(); + Request request = new Request.Builder() + .url(commandString[0]) + .get() + .build(); - if (urlConnection.getResponseCode() != 200) { + Response response = okHttpClient.newCall(request).execute(); + + if (response.code() != 200) { try { - String error = Helpers.convertStreamToString(urlConnection.getErrorStream()); + String error = response.body().string(); Helpers.msgLong(mAppContext, mAppContext.getString(R.string.download_error) + " " + error); Log.e(TAG, "Download OCID data error: " + error); } catch (Exception e) { @@ -230,38 +208,33 @@ protected String doInBackground(String... commandString) { } return "Error"; } else { - // http://stackoverflow.com/questions/10439829/urlconnection-getcontentlength-returns-1 // This returns "-1" for streamed response (Chunked Transfer Encoding) - total = urlConnection.getContentLength(); + total = response.body().contentLength(); if (total == -1 ) { Log.d(TAG, "doInBackground DBE_DOWNLOAD_REQUEST total not returned!"); total = 1024; // Let's set it arbitrarily to something other than "-1" } else { Log.d(TAG, "doInBackground DBE_DOWNLOAD_REQUEST total: " + total); - publishProgress((int) (0.25 * total), total); // Let's show something! + publishProgress((int) (0.25 * total), (int)total); // Let's show something! } FileOutputStream output = new FileOutputStream(file, false); - InputStream input = new BufferedInputStream(urlConnection.getInputStream()); + InputStream input = new BufferedInputStream(response.body().byteStream()); byte[] data = new byte[1024]; while ((count = input.read(data)) > 0) { // writing data to file output.write(data, 0, count); progress += count; - publishProgress(progress, total); + publishProgress(progress, (int)total); } input.close(); // flushing output output.flush(); output.close(); } - urlConnection.disconnect(); return "Successful"; - } catch (MalformedURLException e) { - Log.e(TAG, "Malformed URL", e); - return null; } catch (IOException e) { Log.w(TAG, "Problem reading data from steam", e); return null; From cf447e0972cf2b4555013df7decc6fea9527c6c7 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 00:20:06 +0100 Subject: [PATCH 29/82] use okhttp in favor of HttpUrlConnection --- .../java/com/SecUpwN/AIMSICD/AIMSICD.java | 42 +++++++- .../java/com/SecUpwN/AIMSICD/utils/Cell.java | 99 ++++--------------- 2 files changed, 58 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java b/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java index e46775e50..a5e92d887 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java @@ -51,8 +51,16 @@ import com.SecUpwN.AIMSICD.utils.Icon; import com.SecUpwN.AIMSICD.utils.LocationServices; import com.SecUpwN.AIMSICD.utils.RequestTask; +import com.SecUpwN.AIMSICD.utils.StackOverflowXmlParser; +import com.squareup.okhttp.Callback; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; + +import org.xmlpull.v1.XmlPullParserException; import java.io.File; +import java.io.IOException; import java.util.List; /** @@ -88,6 +96,9 @@ public class AIMSICD extends BaseActivity implements AsyncResponse { private DrawerMenuActivityConfiguration mNavConf; + //TODO: @Inject + OkHttpClient okHttpClient; + /** * Called when the activity is first created. */ @@ -95,6 +106,9 @@ public class AIMSICD extends BaseActivity implements AsyncResponse { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //TODO: Use a dependency Injection for this + okHttpClient = ((AppAIMSICD)getApplication()).getOkHttpClient(); + moveData(); mNavConf = new DrawerMenuActivityConfiguration.Builder(this).build(); @@ -344,8 +358,8 @@ void selectItem(int position) { } } else if (selectedItem.getId() == DrawerMenu.ID.MAIN.ACD) { if (CellTracker.OCID_API_KEY != null && !CellTracker.OCID_API_KEY.equals("NA")) { - Cell.CellLookUpAsync cellLookUpAsync = new Cell.CellLookUpAsync(); - cellLookUpAsync.delegate = this; + + //TODO: Use Retrofit for that StringBuilder sb = new StringBuilder(); sb.append("http://www.opencellid.org/cell/get?key=").append(CellTracker.OCID_API_KEY); @@ -366,7 +380,29 @@ void selectItem(int position) { } sb.append("&format=xml"); - cellLookUpAsync.execute(sb.toString()); + + Request request = new Request.Builder() + .url(sb.toString()) + .get() + .build(); + + okHttpClient.newCall(request) + .enqueue(new Callback() { + @Override + public void onFailure(Request request, IOException e) { + + } + + @Override + public void onResponse(Response response) throws IOException { + try { + List cellList = new StackOverflowXmlParser().parse(response.body().byteStream()); + AIMSICD.this.processFinish(cellList); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } + } + }); } else { Helpers.sendMsg(mContext, mContext.getString(R.string.no_opencellid_key_detected)); } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java index 989a35764..0b2568111 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java @@ -5,22 +5,13 @@ */ package com.SecUpwN.AIMSICD.utils; -import android.os.AsyncTask; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; -import android.util.Log; - -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.List; /** - * Description: TODO: What've got here... - * - * + * Description: TODO: What've got here... */ public class Cell implements Parcelable { @@ -62,7 +53,8 @@ public class Cell implements Parcelable { bearing = 0.0; } - public Cell() {} + public Cell() { + } public Cell(int cid, int lac, int mcc, int mnc, int dbm, long timestamp) { super(); @@ -109,7 +101,7 @@ public Cell(int cid, int lac, int signal, int psc, int netType, boolean dbm) { } public Cell(int cid, int lac, int mcc, int mnc, int dbm, double accuracy, double speed, - double bearing, int netType, long timestamp) { + double bearing, int netType, long timestamp) { this.cid = cid; this.lac = lac; this.mcc = mcc; @@ -461,89 +453,35 @@ public boolean isValid() { return this.getCID() != Integer.MAX_VALUE && this.getLAC() != Integer.MAX_VALUE; } - - /** - * Description: This is used in in the All Current Cell Details (ACD) menu option. - * It was originally meant to look up single cell (BTS) info by querying OCID. - * - * Issues: - * TODO: What is the current development status of this? Implemented? - * - * Dependencies: - * AIMSICD.java -- selectItem() - * - */ - public static class CellLookUpAsync extends AsyncTask> { - public AsyncResponse delegate = null; - - private static final String TAG = "CellLookUpAsync"; - - @Override - protected List doInBackground(String ... urls) { - try { - InputStream stream; - // Instantiate the parser - StackOverflowXmlParser stackOverflowXmlParser = new StackOverflowXmlParser(); - List cells; - - URL url = new URL(urls[0]); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setReadTimeout(10000); // [ms] 10s - conn.setConnectTimeout(15000); // [ms] 15s - conn.setRequestMethod("GET"); - conn.setDoInput(true); - // Starts the query - conn.connect(); - - stream = conn.getInputStream(); - cells = stackOverflowXmlParser.parse(stream); - - conn.disconnect(); - stream.close(); - - return cells; - - } catch (Exception e) { - Log.i(TAG, e.getMessage(), e); - return null; - } - } - - @Override - protected void onPostExecute(List cells) { - delegate.processFinish(cells); - } - } - // Parcelling - public Cell(Parcel in){ + public Cell(Parcel in) { String[] data = new String[15]; in.readStringArray(data); - cid = Integer.valueOf(data[0]); - lac = Integer.valueOf(data[1]); - mcc = Integer.valueOf(data[2]); - mnc = Integer.valueOf(data[3]); - dbm = Integer.valueOf(data[4]); - psc = Integer.valueOf(data[5]); - rssi = Integer.valueOf(data[6]); + cid = Integer.valueOf(data[0]); + lac = Integer.valueOf(data[1]); + mcc = Integer.valueOf(data[2]); + mnc = Integer.valueOf(data[3]); + dbm = Integer.valueOf(data[4]); + psc = Integer.valueOf(data[5]); + rssi = Integer.valueOf(data[6]); timingAdvance = Integer.valueOf(data[7]); - sid = Integer.valueOf(data[8]); + sid = Integer.valueOf(data[8]); netType = Integer.valueOf(data[9]); - lon = Double.valueOf(data[10]); - lat = Double.valueOf(data[11]); - speed = Double.valueOf(data[12]); + lon = Double.valueOf(data[10]); + lat = Double.valueOf(data[11]); + speed = Double.valueOf(data[12]); accuracy = Double.valueOf(data[13]); bearing = Double.valueOf(data[14]); } - public int describeContents(){ + public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeStringArray(new String[] { + dest.writeStringArray(new String[]{ String.valueOf(this.cid), String.valueOf(this.lac), String.valueOf(this.mcc), @@ -560,6 +498,7 @@ public void writeToParcel(Parcel dest, int flags) { String.valueOf(this.accuracy), String.valueOf(this.bearing)}); } + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Cell createFromParcel(Parcel in) { return new Cell(in); From e636ffadc702ed768853d32b5fce260dbd6f7b76 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 00:56:17 +0100 Subject: [PATCH 30/82] fix proguard --- app/proguard-rules.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt index 2da2bb052..c6722ef71 100644 --- a/app/proguard-rules.txt +++ b/app/proguard-rules.txt @@ -73,6 +73,7 @@ public static final android.os.Parcelable$Creator *; } -dontwarn org.apache.** +-dontwarn okio.** -keep class com.kaichunlin.transition.** { *; } -dontwarn com.kaichunlin.transition.** From 3e5c28a53ebb943a376df9bb2d06b8fe2d766f4e Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 11:05:39 +0100 Subject: [PATCH 31/82] Delete split.rb --- server/split.rb | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 server/split.rb diff --git a/server/split.rb b/server/split.rb deleted file mode 100644 index ee97b9540..000000000 --- a/server/split.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'csv' - -CSV.foreach('cell_towers.csv') do |row| - # radio,mcc,net,area,cell,unit,lon,lat,range,samples,changeable,created,updated,averageSignal - File.open("data/#{row[1]}.csv", 'a') do |json_writer| - json_writer.write "#{row[4]},#{row[6]},#{row[7]}\n" - end -end - From 01dbd725002ee97c05fef685a2b9730376fa5080 Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Mon, 7 Dec 2015 11:52:58 +0000 Subject: [PATCH 32/82] Pointed to recommendations page --- README.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ae1930cef..970c5c5d9 100644 --- a/README.md +++ b/README.md @@ -69,21 +69,23 @@ The reason IMSI-Catchers are so commonly used is that it is very easy to get awa Please read our [Disclaimer](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/master/DISCLAIMER)! This app does **not**: -* Provide secure phone calls (see [RedPhone](https://github.com/WhisperSystems/RedPhone)) -* Provide secure data transmission (see [Tor](https://www.torproject.org/)) -* Provide app permission control ([XPrivacy](http://forum.xda-developers.com/xposed/modules/xprivacy-ultimate-android-privacy-app-t2320783)) +* Provide secure phone calls +* Provide secure data transmission +* Provide app permission control * Provide secure application sand-boxing * Provide [ROOT](http://www.xda-developers.com/root) and remove bloatware -* Provide secure SMS (see [SMSSecure](https://github.com/SMSSecure/SMSSecure)) -* Provide firewalls (see [AFWall+](https://github.com/ukanth/afwall)) +* Provide secure SMS +* Provide firewalls * Provide full device encryption -* Prevent already installed rogue applications from full access and spying +* Prevent already installed rogue apps from full access and spying + +Solutions for the above may be found in our [Recommendations](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Recommendations). --- ### Bug Tracker -Please follow [how to correctly submit Issues](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Submitting-Issues). +Please follow our [Bug Submission Guide](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Submitting-Issues). --- @@ -101,7 +103,7 @@ This project is completely licensed [GPL v3+](https://github.com/SecUpwN/Android ### Credits & Greetings -Our project would not have been possible without [these awesome people](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/master/app/src/main/assets/CREDITS). HUGE THANKS! +Our project would not have been possible without [these awesome people](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/master/app/src/main/assets/CREDITS). THANK YOU! --- @@ -115,6 +117,6 @@ Our gratitude flies out to our great Sponsors: ### Get in touch with the core team! -You will find our current team members [here](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Contact). +Core team members are listed [here](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Contact). --- From d317b95e1d84f0555597411688ba61a98533b6cc Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 14:59:33 +0100 Subject: [PATCH 33/82] use Material-Themed AlertDialogs for the About-Fragment --- .../AIMSICD/activities/CustomPopUp.java | 42 ------------- .../AIMSICD/fragments/AboutFragment.java | 61 +++++++++++++++++-- 2 files changed, 55 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java index b7ac7cdcd..d0e9bfd38 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java @@ -61,49 +61,7 @@ protected void onCreate(Bundle savedInstanceState) { setFinishOnTouchOutside(true); switch (mode){ - case 0: - createPopUp( - null, - getString(R.string.status) + "\t" + getString(R.string.idle), - getResources().getString(R.string.detail_info_idle), - getResources().getDrawable(R.drawable.sense_idle)); - break; - case 1: - createPopUp( - null, - getString(R.string.status) + "\t" + getString(R.string.normal), - getResources().getString(R.string.detail_info_normal), - getResources().getDrawable(R.drawable.sense_ok)); - break; - case 2: - createPopUp( - null, - getString(R.string.status) + "\t" + getString(R.string.medium), - getResources().getString(R.string.detail_info_medium), - getResources().getDrawable(R.drawable.sense_medium)); - break; - case 3: - createPopUp( - null, - getString(R.string.status) + "\t" + getString(R.string.high), - getResources().getString(R.string.detail_info_high), - getResources().getDrawable(R.drawable.sense_high)); - break; - case 4: - createPopUp( - null, - getString(R.string.status) + "\t" + getString(R.string.danger), - getResources().getString(R.string.detail_info_danger), - getResources().getDrawable(R.drawable.sense_danger)); - break; - case 5: - createPopUp( - null, - getString(R.string.status) + "\t" + getString(R.string.run), - getResources().getString(R.string.detail_info_run) - ,getResources().getDrawable(R.drawable.sense_skull)); - break; case 6: MiscUtils.showNotification(getApplicationContext(), getResources().getString(R.string.alert_silent_sms_detected), diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index 0512c373a..dc07ea1ac 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -12,7 +12,10 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.DrawableRes; +import android.support.annotation.StringRes; import android.support.v4.app.Fragment; +import android.support.v7.app.AlertDialog; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -101,7 +104,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, imgView_idle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - MiscUtils.startPopUpInfo(mContext, 0); + showInfoDialog(Status.IDLE); } }); @@ -109,7 +112,7 @@ public void onClick(View view) { imgView_normal.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - MiscUtils.startPopUpInfo(mContext, 1); + showInfoDialog(Status.NORMAL); } }); @@ -117,7 +120,7 @@ public void onClick(View view) { imgView_medium.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - MiscUtils.startPopUpInfo(mContext, 2); + showInfoDialog(Status.MEDIUM); } }); @@ -125,7 +128,7 @@ public void onClick(View view) { imgView_high.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - MiscUtils.startPopUpInfo(mContext, 3); + showInfoDialog(Status.HIGH); } }); @@ -133,7 +136,7 @@ public void onClick(View view) { imgView_danger.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - MiscUtils.startPopUpInfo(mContext, 4); + showInfoDialog(Status.DANGER); } }); @@ -141,7 +144,7 @@ public void onClick(View view) { imgView_run.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - MiscUtils.startPopUpInfo(mContext, 5); + showInfoDialog(Status.RUN); } }); } @@ -173,4 +176,50 @@ public void onAttach(Activity activity) { super.onAttach(activity); mContext = activity.getBaseContext(); } + + private void showInfoDialog(Status status){ + new AlertDialog.Builder(getActivity()) + .setIcon(status.getIcon()) + .setTitle(getString(R.string.status) + "\t" + getString(status.getName())) + .setMessage(status.getDescription()) + .show(); + } + + enum Status { + IDLE(R.drawable.sense_idle, R.string.idle, R.string.detail_info_idle), + NORMAL(R.drawable.sense_ok, R.string.normal, R.string.detail_info_normal), + MEDIUM(R.drawable.sense_medium, R.string.medium, R.string.detail_info_medium), + HIGH(R.drawable.sense_high, R.string.high, R.string.detail_info_high), + DANGER(R.drawable.sense_danger, R.string.danger, R.string.detail_info_danger), + RUN(R.drawable.sense_skull, R.string.run, R.string.detail_info_run); + + @DrawableRes + private int icon; + + @StringRes + private int name; + + @StringRes + private int description; + + Status(@DrawableRes int icon, + @StringRes int name, + @StringRes int description) { + this.icon = icon; + this.name = name; + this.description = description; + } + + public int getIcon() { + return icon; + } + + public int getName() { + return name; + } + + public int getDescription() { + return description; + } + } } \ No newline at end of file From b712d8a5cec243574303b7023b3e05f216fa3ad8 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 15:26:26 +0100 Subject: [PATCH 34/82] move Method --- .../SecUpwN/AIMSICD/smsdetection/SmsDetector.java | 14 +++++++++++--- .../java/com/SecUpwN/AIMSICD/utils/MiscUtils.java | 7 ------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index 3537e87d0..4f6d2d056 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -13,6 +13,7 @@ import android.os.IBinder; import android.util.Log; +import com.SecUpwN.AIMSICD.activities.CustomPopUp; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; import com.SecUpwN.AIMSICD.service.AimsicdService; import com.SecUpwN.AIMSICD.utils.Device; @@ -97,6 +98,13 @@ public static void setSmsDetectionState(boolean isRunning) { SmsDetector.isRunning = isRunning; } + public static void startPopUpInfo(Context context,int mode){ + Intent i = new Intent(context, CustomPopUp.class); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + i.putExtra("display_mode",mode); + context.startActivity(i); + } + public void startSmsDetection() { Intent intent = new Intent(mContext, AimsicdService.class); mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); @@ -283,7 +291,7 @@ private void parseTypeZeroSms(String[] bufferLines, String logcat_timestamp) { if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(3, "Detected Type-0 SMS"); - MiscUtils.startPopUpInfo(mContext, 6); + startPopUpInfo(mContext, 6); } else { Log.d(TAG, "Detected Sms already logged"); } @@ -315,7 +323,7 @@ private void parseMwiSms(String[] logcatLines, String logcat_timestamp) { if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(4, "Detected MWI SMS"); - MiscUtils.startPopUpInfo(mContext, 7); + startPopUpInfo(mContext, 7); } else { Log.d(TAG, " Detected Sms already logged"); } @@ -345,7 +353,7 @@ private void parseWapPushSms(String[] logcatLines, String[] postWapMessageLines, if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(6, "Detected WAPPUSH SMS"); - MiscUtils.startPopUpInfo(mContext, 8); + startPopUpInfo(mContext, 8); } else { Log.d(TAG, "Detected SMS already logged"); } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java index 641532f51..4babaf86e 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java @@ -66,13 +66,6 @@ public static String setAssetsString(Context context){ return buildassets.toString(); } - public static void startPopUpInfo(Context context,int mode){ - Intent i = new Intent(context, CustomPopUp.class); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - i.putExtra("display_mode",mode); - context.startActivity(i); - } - public static String getCurrentTimeStamp(){ //yyyyMMddHHmmss <-- this format is needed for OCID upload return new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(new Date()); From cdc0e82d70b859d211285270eda748515d1ee105 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 15:31:31 +0100 Subject: [PATCH 35/82] remove context parameter --- .../SecUpwN/AIMSICD/smsdetection/SmsDetector.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index 4f6d2d056..d99ca74ef 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -98,11 +98,11 @@ public static void setSmsDetectionState(boolean isRunning) { SmsDetector.isRunning = isRunning; } - public static void startPopUpInfo(Context context,int mode){ - Intent i = new Intent(context, CustomPopUp.class); + public void startPopUpInfo(int mode){ + Intent i = new Intent(mContext, CustomPopUp.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra("display_mode",mode); - context.startActivity(i); + mContext.startActivity(i); } public void startSmsDetection() { @@ -291,7 +291,7 @@ private void parseTypeZeroSms(String[] bufferLines, String logcat_timestamp) { if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(3, "Detected Type-0 SMS"); - startPopUpInfo(mContext, 6); + startPopUpInfo(6); } else { Log.d(TAG, "Detected Sms already logged"); } @@ -323,7 +323,7 @@ private void parseMwiSms(String[] logcatLines, String logcat_timestamp) { if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(4, "Detected MWI SMS"); - startPopUpInfo(mContext, 7); + startPopUpInfo(7); } else { Log.d(TAG, " Detected Sms already logged"); } @@ -353,7 +353,7 @@ private void parseWapPushSms(String[] logcatLines, String[] postWapMessageLines, if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(6, "Detected WAPPUSH SMS"); - startPopUpInfo(mContext, 8); + startPopUpInfo(8); } else { Log.d(TAG, "Detected SMS already logged"); } From 3910200d84cb222f3e124dfa5da0a5fdaa026fd3 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 15:34:55 +0100 Subject: [PATCH 36/82] remove title param --- .../java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java index d0e9bfd38..d5f728b0c 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java @@ -27,7 +27,6 @@ package com.SecUpwN.AIMSICD.activities; -import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; @@ -68,7 +67,6 @@ protected void onCreate(Bundle savedInstanceState) { getResources().getString(R.string.app_name_short)+ " - "+getResources().getString(R.string.typezero_header), R.drawable.sense_danger,true); createPopUp( - getResources().getString(R.string.typezero_title), getResources().getString(R.string.typezero_header), getResources().getString(R.string.typezero_data) ,getResources().getDrawable(R.drawable.sense_danger)); @@ -81,7 +79,6 @@ protected void onCreate(Bundle savedInstanceState) { R.drawable.sense_danger,true); createPopUp( - getResources().getString(R.string.typemwi_title), getResources().getString(R.string.typemwi_header), getResources().getString(R.string.typemwi_data) ,getResources().getDrawable(R.drawable.sense_danger)); @@ -94,7 +91,6 @@ protected void onCreate(Bundle savedInstanceState) { R.drawable.sense_danger,true); createPopUp( - getResources().getString(R.string.typemwi_title), getResources().getString(R.string.typewap_header), getResources().getString(R.string.typewap_data) ,getResources().getDrawable(R.drawable.sense_danger)); @@ -103,10 +99,7 @@ protected void onCreate(Bundle savedInstanceState) { } } - public void createPopUp(String title,String header,String data,Drawable icon){ - if(title != null){ - tv_popup_title.setText(title); - } + public void createPopUp(String header, String data, Drawable icon){ if(header != null){ about_tv_status.setText(header); From 24cbf050bc82b2308084831d2b4f601bfc1648d2 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 16:19:09 +0100 Subject: [PATCH 37/82] use AlertDialogs in SmsDetector --- .../AIMSICD/activities/CustomPopUp.java | 54 -------------- .../AIMSICD/smsdetection/SmsDetector.java | 73 ++++++++++++++++--- .../com/SecUpwN/AIMSICD/utils/MiscUtils.java | 1 - 3 files changed, 64 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java index d5f728b0c..828d5fa58 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java @@ -27,7 +27,6 @@ package com.SecUpwN.AIMSICD.activities; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.MotionEvent; @@ -59,59 +58,6 @@ protected void onCreate(Bundle savedInstanceState) { } setFinishOnTouchOutside(true); - switch (mode){ - - case 6: - MiscUtils.showNotification(getApplicationContext(), - getResources().getString(R.string.alert_silent_sms_detected), - getResources().getString(R.string.app_name_short)+ " - "+getResources().getString(R.string.typezero_header), - R.drawable.sense_danger,true); - createPopUp( - getResources().getString(R.string.typezero_header), - getResources().getString(R.string.typezero_data) - ,getResources().getDrawable(R.drawable.sense_danger)); - break; - - case 7: - MiscUtils.showNotification(getApplicationContext(), - getResources().getString(R.string.alert_mwi_detected), - getResources().getString(R.string.app_name_short)+" - "+getResources().getString(R.string.typemwi_header), - R.drawable.sense_danger,true); - - createPopUp( - getResources().getString(R.string.typemwi_header), - getResources().getString(R.string.typemwi_data) - ,getResources().getDrawable(R.drawable.sense_danger)); - break; - - case 8: - MiscUtils.showNotification(getApplicationContext(), - getResources().getString(R.string.alert_silent_wap_sms_detected), - getResources().getString(R.string.app_name_short)+" - "+getResources().getString(R.string.typewap_header), - R.drawable.sense_danger,true); - - createPopUp( - getResources().getString(R.string.typewap_header), - getResources().getString(R.string.typewap_data) - ,getResources().getDrawable(R.drawable.sense_danger)); - break; - - } - } - - public void createPopUp(String header, String data, Drawable icon){ - - if(header != null){ - about_tv_status.setText(header); - } - if(data != null){ - about_tv_data.setText(data); - } - if(icon != null){ - about_icon_holder.setImageDrawable(icon); - } - - } public boolean onTouchEvent(MotionEvent event) { diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index d99ca74ef..0649d6f14 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -11,9 +11,11 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; +import android.support.annotation.StringRes; +import android.support.v7.app.AlertDialog; import android.util.Log; -import com.SecUpwN.AIMSICD.activities.CustomPopUp; +import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; import com.SecUpwN.AIMSICD.service.AimsicdService; import com.SecUpwN.AIMSICD.utils.Device; @@ -98,11 +100,19 @@ public static void setSmsDetectionState(boolean isRunning) { SmsDetector.isRunning = isRunning; } - public void startPopUpInfo(int mode){ - Intent i = new Intent(mContext, CustomPopUp.class); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - i.putExtra("display_mode",mode); - mContext.startActivity(i); + public void startPopUpInfo(SmsType mode){ + MiscUtils.showNotification( + mContext, + mContext.getString(mode.getAlert()), + mContext.getString(R.string.app_name_short) + " - " + mContext.getString(mode.getTitle()), + R.drawable.sense_danger, + true); + + new AlertDialog.Builder(mContext) + .setTitle(mode.getTitle()) + .setMessage(mode.getMessage()) + .setIcon(R.drawable.sense_danger) + .show(); } public void startSmsDetection() { @@ -291,7 +301,7 @@ private void parseTypeZeroSms(String[] bufferLines, String logcat_timestamp) { if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(3, "Detected Type-0 SMS"); - startPopUpInfo(6); + startPopUpInfo(SmsType.SILENT); } else { Log.d(TAG, "Detected Sms already logged"); } @@ -323,7 +333,7 @@ private void parseMwiSms(String[] logcatLines, String logcat_timestamp) { if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(4, "Detected MWI SMS"); - startPopUpInfo(7); + startPopUpInfo(SmsType.MWI); } else { Log.d(TAG, " Detected Sms already logged"); } @@ -353,7 +363,7 @@ private void parseWapPushSms(String[] logcatLines, String[] postWapMessageLines, if (!mDbAdapter.isTimeStampInDB(logcat_timestamp)) { mDbAdapter.storeCapturedSms(capturedSms); mDbAdapter.toEventLog(6, "Detected WAPPUSH SMS"); - startPopUpInfo(8); + startPopUpInfo(SmsType.WAP_PUSH); } else { Log.d(TAG, "Detected SMS already logged"); } @@ -432,4 +442,49 @@ public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; + + public enum SmsType { + SILENT( + R.string.alert_silent_sms_detected, + R.string.typezero_header, + R.string.typezero_data), + MWI( + R.string.alert_mwi_detected, + R.string.typemwi_header, + R.string.typemwi_data), + WAP_PUSH( + R.string.alert_silent_wap_sms_detected, + R.string.typewap_header, + R.string.typewap_data + ); + + SmsType(@StringRes int alert, + @StringRes int title, + @StringRes int message) { + this.alert = alert; + this.title = title; + this.message = message; + } + + @StringRes + private int alert; + + @StringRes + private int title; + + @StringRes + private int message; + + public int getAlert() { + return alert; + } + + public int getTitle() { + return title; + } + + public int getMessage() { + return message; + } + } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java index 4babaf86e..03c43ed93 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java @@ -17,7 +17,6 @@ import com.SecUpwN.AIMSICD.AIMSICD; import com.SecUpwN.AIMSICD.R; -import com.SecUpwN.AIMSICD.activities.CustomPopUp; import java.io.BufferedReader; import java.io.InputStreamReader; From 0ee445054c783f79fb7f5970d068b9cb1a42a3ce Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 16:21:46 +0100 Subject: [PATCH 38/82] Remove the unused CustomPopUp Activity --- app/src/main/AndroidManifest.xml | 6 -- .../AIMSICD/activities/CustomPopUp.java | 76 ---------------- app/src/main/res/layout/about_pop_up.xml | 89 ------------------- 3 files changed, 171 deletions(-) delete mode 100644 app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java delete mode 100644 app/src/main/res/layout/about_pop_up.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 236207fd8..dea3b147a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -178,12 +178,6 @@ android:theme="@android:style/Theme.Dialog" android:screenOrientation="portrait"> - - - diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java deleted file mode 100644 index 828d5fa58..000000000 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CustomPopUp.java +++ /dev/null @@ -1,76 +0,0 @@ -/* Android IMSI-Catcher Detector | (c) AIMSICD Privacy Project - * ----------------------------------------------------------- - * LICENSE: http://git.io/vki47 | TERMS: http://git.io/vki4o - * ----------------------------------------------------------- - */ - -/* Coded by Paul Kinsella - - Basic Pop Up Screen with Icon - Header - data - - To create a new dialog add this to the case block: - - case 6://your case value for your custom popup - createPopUp( - "YOUR TITLE", - "YOUR HEADER", - "YOUR DATA" - ,getResources().getDrawable(R.drawable.sense_idle));//set your icon - - To call from any activity use: - - MiscUtils.startPopUpInfo(YOUR APP CONTEXT,0); - - The int value is your custom dialog value eg case 10: - - */ - -package com.SecUpwN.AIMSICD.activities; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.view.MotionEvent; -import android.view.Window; -import android.widget.ImageView; -import android.widget.TextView; - -import com.SecUpwN.AIMSICD.R; -import com.SecUpwN.AIMSICD.utils.MiscUtils; - -public class CustomPopUp extends AppCompatActivity { - TextView tv_popup_title,about_tv_status,about_tv_data; - ImageView about_icon_holder; - int mode = 0; //default - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); - setContentView(R.layout.about_pop_up); - - about_icon_holder = (ImageView)findViewById(R.id.about_icon_holder); - about_tv_status = (TextView)findViewById(R.id.about_tv_status); - about_tv_data = (TextView)findViewById(R.id.about_tv_data); - tv_popup_title = (TextView)findViewById(R.id.tv_popup_title); - - Bundle extras = getIntent().getExtras(); - if (extras != null) { - mode = extras.getInt("display_mode"); - } - - setFinishOnTouchOutside(true); - } - - public boolean onTouchEvent(MotionEvent event) { - switch(event.getAction()) { - case MotionEvent.ACTION_DOWN: - if(mode == 6 || mode == 7 || mode == 8) { - MiscUtils.showNotification(getApplicationContext(), - getResources().getString(R.string.app_name_short), - getResources().getString(R.string.app_name_short) + " - " + getResources().getString(R.string.status_good), - R.drawable.sense_ok, false); - } - finish(); - } - return true; - } -} diff --git a/app/src/main/res/layout/about_pop_up.xml b/app/src/main/res/layout/about_pop_up.xml deleted file mode 100644 index 9415d0c53..000000000 --- a/app/src/main/res/layout/about_pop_up.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 32a482505d70984e318b63dc225fdb2f77dbe283 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 16:33:00 +0100 Subject: [PATCH 39/82] reformat code --- .../AIMSICD/fragments/AboutFragment.java | 43 ++++++++++++++----- .../AIMSICD/smsdetection/SmsDetector.java | 16 ++++--- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index dc07ea1ac..34240fec6 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -26,7 +26,6 @@ import com.SecUpwN.AIMSICD.BuildConfig; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.activities.CreditsRollActivity; -import com.SecUpwN.AIMSICD.utils.MiscUtils; public class AboutFragment extends Fragment { @@ -66,7 +65,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, versionNumber = (TextView) v.findViewById(R.id.aimsicd_version); versionNumber.setText(getString(R.string.app_version) + version); - if(!"NA".equals(BUILDOZER_BUILDNUMBER)) { + if (!"NA".equals(BUILDOZER_BUILDNUMBER)) { BuildozerView = (TextView) v.findViewById(R.id.buildozer_buildnumber); BuildozerView.setText(getString(R.string.buildozer_buildnumber) + BUILDOZER_BUILDNUMBER); BuildozerView.setVisibility(View.VISIBLE); @@ -177,7 +176,7 @@ public void onAttach(Activity activity) { mContext = activity.getBaseContext(); } - private void showInfoDialog(Status status){ + private void showInfoDialog(Status status) { new AlertDialog.Builder(getActivity()) .setIcon(status.getIcon()) .setTitle(getString(R.string.status) + "\t" + getString(status.getName())) @@ -185,13 +184,37 @@ private void showInfoDialog(Status status){ .show(); } - enum Status { - IDLE(R.drawable.sense_idle, R.string.idle, R.string.detail_info_idle), - NORMAL(R.drawable.sense_ok, R.string.normal, R.string.detail_info_normal), - MEDIUM(R.drawable.sense_medium, R.string.medium, R.string.detail_info_medium), - HIGH(R.drawable.sense_high, R.string.high, R.string.detail_info_high), - DANGER(R.drawable.sense_danger, R.string.danger, R.string.detail_info_danger), - RUN(R.drawable.sense_skull, R.string.run, R.string.detail_info_run); + public enum Status { + IDLE( + R.drawable.sense_idle, + R.string.idle, + R.string.detail_info_idle + ), + NORMAL( + R.drawable.sense_ok, + R.string.normal, + R.string.detail_info_normal + ), + MEDIUM( + R.drawable.sense_medium, + R.string.medium, + R.string.detail_info_medium + ), + HIGH( + R.drawable.sense_high, + R.string.high, + R.string.detail_info_high + ), + DANGER( + R.drawable.sense_danger, + R.string.danger, + R.string.detail_info_danger + ), + RUN( + R.drawable.sense_skull, + R.string.run, + R.string.detail_info_run + ); @DrawableRes private int icon; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index 0649d6f14..4cab2b099 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -100,17 +100,17 @@ public static void setSmsDetectionState(boolean isRunning) { SmsDetector.isRunning = isRunning; } - public void startPopUpInfo(SmsType mode){ + public void startPopUpInfo(SmsType smsType) { MiscUtils.showNotification( mContext, - mContext.getString(mode.getAlert()), - mContext.getString(R.string.app_name_short) + " - " + mContext.getString(mode.getTitle()), + mContext.getString(smsType.getAlert()), + mContext.getString(R.string.app_name_short) + " - " + mContext.getString(smsType.getTitle()), R.drawable.sense_danger, true); new AlertDialog.Builder(mContext) - .setTitle(mode.getTitle()) - .setMessage(mode.getMessage()) + .setTitle(smsType.getTitle()) + .setMessage(smsType.getMessage()) .setIcon(R.drawable.sense_danger) .show(); } @@ -447,11 +447,13 @@ public enum SmsType { SILENT( R.string.alert_silent_sms_detected, R.string.typezero_header, - R.string.typezero_data), + R.string.typezero_data + ), MWI( R.string.alert_mwi_detected, R.string.typemwi_header, - R.string.typemwi_data), + R.string.typemwi_data + ), WAP_PUSH( R.string.alert_silent_wap_sms_detected, R.string.typewap_header, From f3f611867f3268e18cfb135d7603e054c9287c97 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 22:59:17 +0100 Subject: [PATCH 40/82] little appcompat fix --- app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java index 36802260f..98332f6ca 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java @@ -77,7 +77,7 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_debug_logs); // Show the Up button in the action bar. - getActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); logView = (TextView) findViewById(R.id.debug_log_view); btnClear = (Button) findViewById(R.id.btnClear); From 0219b5a7e395d37dbd894a74b869836160506568 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 23:18:44 +0100 Subject: [PATCH 41/82] some more Annotations --- .../AIMSICD/fragments/AboutFragment.java | 3 +++ .../AIMSICD/smsdetection/SmsDetector.java | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index 34240fec6..fe48c1854 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -233,14 +233,17 @@ public enum Status { this.description = description; } + @DrawableRes public int getIcon() { return icon; } + @StringRes public int getName() { return name; } + @StringRes public int getDescription() { return description; } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index 4cab2b099..2675da3b8 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -460,14 +460,6 @@ public enum SmsType { R.string.typewap_data ); - SmsType(@StringRes int alert, - @StringRes int title, - @StringRes int message) { - this.alert = alert; - this.title = title; - this.message = message; - } - @StringRes private int alert; @@ -477,14 +469,25 @@ public enum SmsType { @StringRes private int message; + SmsType(@StringRes int alert, + @StringRes int title, + @StringRes int message) { + this.alert = alert; + this.title = title; + this.message = message; + } + + @StringRes public int getAlert() { return alert; } + @StringRes public int getTitle() { return title; } + @StringRes public int getMessage() { return message; } From ac9e7d6e826e0663179867f174c7cdace58ad029 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 23:21:55 +0100 Subject: [PATCH 42/82] more AppCompatActivities --- .../SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java | 4 ++-- .../SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java index b52c1ffa4..983bab41b 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java @@ -8,9 +8,9 @@ package com.SecUpwN.AIMSICD.smsdetection; -import android.app.Activity; import android.content.ContentValues; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.AdapterView; @@ -26,7 +26,7 @@ import java.util.ArrayList; -public class AdvancedUserActivity extends Activity { +public class AdvancedUserActivity extends AppCompatActivity { private static final String TAG = "AdvancedUserActivity"; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java index cfa902029..cbfb11f5b 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java @@ -8,9 +8,9 @@ package com.SecUpwN.AIMSICD.smsdetection; -import android.app.Activity; import android.database.Cursor; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.AdapterView; @@ -23,7 +23,7 @@ import java.util.ArrayList; -public class AdvancedUserSmsActivity extends Activity { +public class AdvancedUserSmsActivity extends AppCompatActivity { final static String TAG ="AdvancedUserSmsActivity"; ListView listViewAdv; AIMSICDDbAdapter dbaccess; From 7ca30d902fd1f6924e970cb0419b30d8d1059f8b Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 7 Dec 2015 23:24:34 +0100 Subject: [PATCH 43/82] update menus to correctly use `showAsAction` --- app/src/main/res/menu/activity_debug_logs.xml | 18 +++++++++------ app/src/main/res/menu/map_viewer_menu.xml | 22 +++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/menu/activity_debug_logs.xml b/app/src/main/res/menu/activity_debug_logs.xml index 0416251d5..0f64c176c 100644 --- a/app/src/main/res/menu/activity_debug_logs.xml +++ b/app/src/main/res/menu/activity_debug_logs.xml @@ -1,15 +1,19 @@ - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/map_viewer_menu.xml b/app/src/main/res/menu/map_viewer_menu.xml index 53e779f51..f5703d2f6 100644 --- a/app/src/main/res/menu/map_viewer_menu.xml +++ b/app/src/main/res/menu/map_viewer_menu.xml @@ -1,12 +1,16 @@ - - - + + + \ No newline at end of file From d8c81c6090f6fcbbae309aa6e923149dd88ef7ca Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 12:05:04 +0100 Subject: [PATCH 44/82] fix app-crash --- .../main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index 2675da3b8..a1530b740 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -151,6 +151,7 @@ public void run() { mLogcatReader = new BufferedReader(new InputStreamReader(process.getInputStream())); } catch (InterruptedException | IOException e) { Log.e(TAG, "Exception while initializing LogCat (time, radio, main) reader", e); + return; } String logcatLine; From 7e0826728c02d8775721478ff6b8b2e6e0f73872 Mon Sep 17 00:00:00 2001 From: ikmaak Date: Tue, 8 Dec 2015 02:20:21 +0100 Subject: [PATCH 45/82] Translated using Weblate (Dutch) Currently translated at 98.9% (293 of 296 strings) --- .../res/values-nl/translatable_strings.xml | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-nl/translatable_strings.xml b/app/src/main/res/values-nl/translatable_strings.xml index 59422340c..c9b3a30a2 100644 --- a/app/src/main/res/values-nl/translatable_strings.xml +++ b/app/src/main/res/values-nl/translatable_strings.xml @@ -6,8 +6,8 @@ Stoppen OK Annuleren - Accoord - Niet accoord + Akkoord + Niet akkoord DISCLAIMER Aanvalsdetectie aan/uit @@ -27,7 +27,7 @@ Apparaatgegevens SIM gegevens - Netwerk gegevens + Netwerkgegevens Huidig gevarenniveau Buurcellen Encryptie indicator @@ -84,7 +84,7 @@ Systeeminstellingen Automatisch starten Service automatisch starten bij opstarten telefoon - "Door het gebruik van AIMSICD begrijpt u en gaat u er mee accoord dat AIMSICD een experimenteel en informatief Android programma is dat door verschiullende redenen mogelijk niet in staat is om volgsystemen te detecteren. U begrijpt ook dat het op andere manieren die de ontwikkelaars momenteel nog niet begrijpen omzeild kan worden. U begrijpt en gaat er tevens mee accoord dat dit de ontwikkelaars van dit gratis project in geen geval verantwoordelijk te houden zijn voor elk resultaat en gebruik van dit programma. " + "Door het gebruik van AIMSICD begrijpt u en gaat u er mee akkoord dat AIMSICD een experimenteel en informatief Android programma is dat door verschillende redenen mogelijk niet in staat is om volgsystemen te detecteren. U begrijpt ook dat het op andere manieren die de ontwikkelaars momenteel nog niet begrijpen omzeild kan worden. U begrijpt en gaat er tevens mee akkoord dat dit de ontwikkelaars van dit gratis project in geen geval verantwoordelijk te houden zijn voor elk resultaat en gebruik van dit programma. " Inactief / aan het laden. Permanente service @@ -314,4 +314,17 @@ De database is succesvol verwijderd en opnieuw aangemaakt.\nHerstart de app om oude gegevens uit het geheugen te verwijderen. + Normaal + Gemiddeld + Alarm + + Verwijderd + Fout bij het verwijderen + De string is toegevoegd aan de database + Trilfunctie Inschakelen + Vibreren bij gevarenniveau + Selecteer het minimum gevarenniveau voor de trilfunctie + Inactief + String aan database toevoegen is mislukt + From 671145afcab92b9e0a609b3c407c48ef5b3f740d Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Mon, 7 Dec 2015 18:42:11 +0100 Subject: [PATCH 46/82] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 13.5% (40 of 296 strings) --- .../res/values-nb/translatable_strings.xml | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-nb/translatable_strings.xml b/app/src/main/res/values-nb/translatable_strings.xml index 8307e8eed..6192f1e73 100644 --- a/app/src/main/res/values-nb/translatable_strings.xml +++ b/app/src/main/res/values-nb/translatable_strings.xml @@ -12,17 +12,17 @@ - - - - + Styr angrepsoppdaging + Styr cellesporing + Sikkerhetskopier database + Nullstill/Tilbakestill database Alle data vil slettes.\nEr du sikker? - + Tilbakefør database Trykk på nytt for å gå ut. - - + Alle gjeldende celledetaljer + Feilsøking Ingen Internett-forbindelse - + Klarte ikke laste ned OpenCellID-data uten Internettilkobling, vær så snill å slå på datatilkobling! Last med BTS-data @@ -30,7 +30,7 @@ SIM-informasjon Nettverksinformasjon Gjeldende trusselsnivå - + Naboceller Total: Land: @@ -51,5 +51,6 @@ Frisk opp - + + From 5ed3bfd9daebdc00abe61fcb3b00e11b467e4b94 Mon Sep 17 00:00:00 2001 From: Olexandr Nesterenko Date: Sun, 6 Dec 2015 23:31:08 +0100 Subject: [PATCH 47/82] Translated using Weblate (Ukrainian) Currently translated at 64.8% (192 of 296 strings) --- .../res/values-uk/translatable_strings.xml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/main/res/values-uk/translatable_strings.xml b/app/src/main/res/values-uk/translatable_strings.xml index 4fda80480..abedf5a27 100644 --- a/app/src/main/res/values-uk/translatable_strings.xml +++ b/app/src/main/res/values-uk/translatable_strings.xml @@ -189,4 +189,25 @@ OpenCellID дані успішно отримано.\nМаркери карти оновлено. Стан: Поточний послідовний пристрій: + Додаток працює в режимі очікування чи завантаження. Заходи захисту та моніторингу вимкнуто. Будь ласка, відкрийте меню та увімкніть їх в розділі СЛІДКУВАННЯ! + Жодних загроз не виявлено. Наш додаток постійно перевіряє вашу мережу на основі заходів захисту, які ви зазначили в меню та налаштуваннях. + Білі + Земний + Звичайний + Вручну + Автоматично + Основне + Ворожа зона обслуговування: виявлено зміну LAC! + Виявлення фемтоточок активовано. + Відслідковування стільника активовано. + Моніторинг стільника активовано. + Статус: Все добре. Загроз не виявлено. + Статус сервісу змінено! + : Зупинено моніторинг з\'єднання з фемтоточкою. + Помилка завантаження: + Дані OpenCellID успішно прийнято. + Помилка під час отримання OpenCellID даних.\nПеревірте вашу мережу! + Помилка відновлення бази даних. + Резервну копію бази даних успішно скопійовано до: + Помилка резервного копіювання бази даних. From 4f52d86802177b97ba98d86640e3b02050ee79ac Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 12:53:33 +0100 Subject: [PATCH 48/82] add dependency --- app/build.gradle | 1 + build.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 993588c0e..3891c9bcb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -125,6 +125,7 @@ dependencies { compile 'org.apache.commons:commons-lang3:3.3.2' compile 'com.google.code.gson:gson:2.2.4' compile 'com.github.kaichunlin.transition:core:0.9.2' + compile 'io.freefair.android-util:logging:1.1.0' //debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' //releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' } diff --git a/build.gradle b/build.gradle index a40632890..14ee0ac7c 100644 --- a/build.gradle +++ b/build.gradle @@ -12,5 +12,6 @@ buildscript { allprojects { repositories { mavenCentral() + maven { url "https://jitpack.io" } } } From fd100505ab257940899633cbc2f60c0d3c9b18f1 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 13:07:33 +0100 Subject: [PATCH 49/82] use logger in Activities --- .../AIMSICD/activities/BaseActivity.java | 18 ++++++------- .../activities/CreditsRollActivity.java | 1 - .../SecUpwN/AIMSICD/activities/DebugLogs.java | 17 +++++++----- .../AIMSICD/activities/MapViewerOsmDroid.java | 22 ++++++++------- .../activities/OpenCellIdActivity.java | 27 ++++++++++--------- 5 files changed, 46 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java index ce0104eb0..2e0efe7eb 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java @@ -10,25 +10,25 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; -import android.support.v4.app.FragmentActivity; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.service.AimsicdService; import com.SecUpwN.AIMSICD.utils.Icon; import com.SecUpwN.AIMSICD.utils.Status; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Base activity class, handles code that is shared between all activities * * @author Tor Henning Ueland */ public class BaseActivity extends AppCompatActivity { - private static final String TAG = "AIMSICD"; - private static final String mTAG = "BaseActivity"; - + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(BaseActivity.class); /** * Triggered when GUI is opened @@ -36,7 +36,7 @@ public class BaseActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - Log.d(TAG, mTAG + ": StatusWatcher starting watching"); + log.debug("StatusWatcher starting watching"); LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("StatusChange")); updateIcon(this); @@ -48,8 +48,8 @@ protected void onResume() { private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Log.d(TAG, mTAG + ": StatusWatcher received status change to " + Status.getStatus().name()+", updating icon"); - updateIcon(context); + log.debug("StatusWatcher received status change to " + Status.getStatus().name() + ", updating icon"); + updateIcon(context); } }; @@ -72,7 +72,7 @@ public void run() { @Override protected void onPause() { super.onPause(); - Log.d(TAG, mTAG + ": StatusWatcher stopped watching"); + log.debug("StatusWatcher stopped watching"); LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java index efeecc4e2..5507bfb68 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java @@ -17,7 +17,6 @@ package com.SecUpwN.AIMSICD.activities; -import android.app.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java index 98332f6ca..80dc6de49 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java @@ -10,7 +10,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NavUtils; -import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -25,6 +24,9 @@ import java.io.IOException; import java.io.InputStreamReader; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: This class is providing for the Debug log feature in the swipe menu. * It reads the last 500 lines from the Logcat ring buffers: main and radio. @@ -61,7 +63,8 @@ public class DebugLogs extends BaseActivity { - private static final String TAG = "DebugLogs"; + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(DebugLogs.class); private LogUpdaterThread logUpdater = null; private boolean updateLogs = true; @@ -97,7 +100,7 @@ public void onClick(View view) { try { clearLogs(); } catch (IOException e) { - Log.e(TAG, "Error clearing logs", e); + log.error("Error clearing logs", e); } } }); @@ -211,7 +214,7 @@ public void run() { intent.putExtra(Intent.EXTRA_TEXT, log); startActivity(Intent.createChooser(intent, "Send Error Log")); } catch (IOException e) { - Log.w(TAG, "Error reading logs", e); + log.warn("Error reading logs", e); } } }.start(); @@ -303,7 +306,7 @@ public void run() { try { Runtime.getRuntime().exec("logcat -c -b main -b system -b radio -b events"); } catch (IOException e) { - Log.e(TAG, "Error clearing logs", e); + log.error("Error clearing logs", e); } runOnUiThread(new Runnable() { @@ -341,12 +344,12 @@ public void run() { }); } } catch (IOException e) { - Log.w(TAG, "Error updating logs", e); + log.warn("Error updating logs", e); } try { Thread.sleep(1000); } catch (InterruptedException e) { - Log.w(TAG, "Thread was interrupted", e); + log.warn("Thread was interrupted", e); } } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java index 9447634e3..85fd76d79 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java @@ -24,7 +24,6 @@ import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.TelephonyManager; -import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -57,6 +56,9 @@ import java.util.LinkedList; import java.util.List; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: TODO: add details *

@@ -88,7 +90,7 @@ public final class MapViewerOsmDroid extends BaseActivity implements OnSharedPreferenceChangeListener { - private final String TAG = "AIMSICD_MapViewer"; + private final Logger log = AndroidLogger.forClass(MapViewerOsmDroid.class); public static final String updateOpenCellIDMarkers = "update_open_cell_markers"; private MapView mMap; @@ -123,7 +125,7 @@ public void onCellInfoChanged(List cellInfo) { */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "Starting MapViewer"); + log.info("Starting MapViewer"); super.onCreate(savedInstanceState); mContext = this; @@ -207,7 +209,7 @@ protected void onPause() { public void onReceive(Context context, Intent intent) { loadEntries(); if (BuildConfig.DEBUG && mCellTowerGridMarkerClusterer != null && mCellTowerGridMarkerClusterer.getItems() != null) { - Log.v(TAG, "mMessageReceiver CellTowerMarkers.invalidate() markers.size():" + mCellTowerGridMarkerClusterer.getItems().size()); + log.verbose("mMessageReceiver CellTowerMarkers.invalidate() markers.size():" + mCellTowerGridMarkerClusterer.getItems().size()); } } @@ -238,7 +240,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName arg0) { - Log.e(TAG, "Service Disconnected"); + log.error("Service Disconnected"); mBound = false; } }; @@ -400,7 +402,7 @@ protected GeoPoint doInBackground(Void... voids) { // Grab cell data from CELL_TABLE (cellinfo) --> DBi_bts c = mDbHelper.getCellData(); } catch (IllegalStateException ix) { - Log.e(TAG, "Problem getting data from CELL_TABLE", ix); + log.error("Problem getting data from CELL_TABLE", ix); } /* @@ -469,7 +471,7 @@ public void run() { double[] d = mDbHelper.getDefaultLocation(mcc); ret = new GeoPoint(d[0], d[1]); } catch (Exception e) { - Log.e("map", "Error getting default location!", e); + log.error("Error getting default location!", e); } } if (c != null) { @@ -482,7 +484,7 @@ public void run() { return null; Thread.sleep(100); } catch (InterruptedException e) { - Log.w(TAG, "thread interrupted", e); + log.warn("thread interrupted", e); } List nc = mAimsicdService.getCellTracker().updateNeighbouringCells(); for (Cell cell : nc) { @@ -505,7 +507,7 @@ public void run() { ovm.setIcon(getResources().getDrawable(R.drawable.ic_map_pin_orange)); items.add(ovm); } catch (Exception e) { - Log.e("map", "Error plotting neighbouring cells", e); + log.error("Error plotting neighbouring cells", e); } } @@ -549,7 +551,7 @@ protected void onPostExecute(GeoPoint defaultLoc) { } if (mCellTowerGridMarkerClusterer != null) { if (BuildConfig.DEBUG && mCellTowerGridMarkerClusterer.getItems() != null) { - Log.v(TAG, "CellTowerMarkers.invalidate() markers.size():" + mCellTowerGridMarkerClusterer.getItems().size()); + log.verbose("CellTowerMarkers.invalidate() markers.size():" + mCellTowerGridMarkerClusterer.getItems().size()); } //Drawing markers of cell tower immediately as possible mCellTowerGridMarkerClusterer.invalidate(); diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java index b11dc25c1..dd5b1f836 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java @@ -9,7 +9,6 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; -import android.util.Log; import android.view.View; import com.SecUpwN.AIMSICD.AppAIMSICD; @@ -23,6 +22,9 @@ import java.io.IOException; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: Popup toast messages asking if user wants to download new API key * to access OpenCellId services and data. @@ -37,7 +39,8 @@ */ public class OpenCellIdActivity extends BaseActivity { private SharedPreferences prefs; - private static final String TAG = "OpenCellIdActivity"; + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(OpenCellIdActivity.class); private ProgressDialog pd; //TODO: @Inject @@ -77,7 +80,7 @@ protected String doInBackground(Void... voids) { try { return requestNewOCIDKey(); } catch (final IOException e) { - Log.w(TAG, "Error getting new OCID-API", e); + log.warn("Error getting new OCID-API", e); /** * In case response from OCID takes more time and user pressed back or anything else, @@ -164,38 +167,38 @@ public String requestNewOCIDKey() throws IOException { String htmlResponse = response.body().string(); // For debugging HTTP server response and codes - Log.d(TAG, "Response Html=" + htmlResponse + " Response Code=" + String.valueOf(responseCode)); + log.debug("Response Html=" + htmlResponse + " Response Code=" + String.valueOf(responseCode)); if (responseCode == 200) { - Log.d(TAG, "OCID Code 1: Cell Not found: " + htmlResponse); + log.debug("OCID Code 1: Cell Not found: " + htmlResponse); return htmlResponse; } else if (responseCode == 401) { - Log.d(TAG, "OCID Code 2: Invalid API Key! :" + htmlResponse); + log.debug("OCID Code 2: Invalid API Key! :" + htmlResponse); return htmlResponse; } else if(responseCode == 400){ - Log.d(TAG, "OCID Code 3: Invalid input data: " + htmlResponse); + log.debug("OCID Code 3: Invalid input data: " + htmlResponse); return "Bad Request"; // For making a toast! } else if (responseCode == 403) { - Log.d(TAG, "OCID Code 4: Your API key must be white listed: " + htmlResponse); + log.debug("OCID Code 4: Your API key must be white listed: " + htmlResponse); return "Bad Request"; // For making a toast! } else if(responseCode == 500){ - Log.d(TAG, "OCID Code 5: Remote internal server error: " + htmlResponse); + log.debug("OCID Code 5: Remote internal server error: " + htmlResponse); return "Bad Request"; // For making a toast! } else if (responseCode == 503) { - Log.d(TAG, "OCID Code 6: Reached 24hr API key request limit: " + htmlResponse); + log.debug("OCID Code 6: Reached 24hr API key request limit: " + htmlResponse); return htmlResponse; } else if(responseCode == 429){ - Log.d(TAG, "OCID Code 7: Exceeded daily request limit (1000) for your API key: " + htmlResponse); + log.debug("OCID Code 7: Exceeded daily request limit (1000) for your API key: " + htmlResponse); return htmlResponse; } else { - Log.e(TAG, "OCID Returned Unknown Response: " + responseCode); + log.debug("OCID Returned Unknown Response: " + responseCode); return null; } } From 1a36748d2c4dfac99a6067ba3bde88e7e7940899 Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Tue, 8 Dec 2015 12:36:57 +0000 Subject: [PATCH 50/82] THANK YOU for facelifting AIMSICD, @larsgrefer! --- app/src/main/assets/CREDITS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/assets/CREDITS b/app/src/main/assets/CREDITS index 523339a13..d47f94e56 100644 --- a/app/src/main/assets/CREDITS +++ b/app/src/main/assets/CREDITS @@ -236,3 +236,7 @@ Marek Sebera\n https://github.com/smarek\n for saving our project from death!\n \n +Lars Grefer\n +https://github.com/larsgrefer\n +for all incredible improvements! ;-)\n +\n From a4f1b0980eeb53e7df1d87f9dd7e3522e975c743 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 13:45:03 +0100 Subject: [PATCH 51/82] add missing comment --- .../java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java index 85fd76d79..26e6bbb47 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java @@ -90,6 +90,7 @@ public final class MapViewerOsmDroid extends BaseActivity implements OnSharedPreferenceChangeListener { + //TODO: @Inject private final Logger log = AndroidLogger.forClass(MapViewerOsmDroid.class); public static final String updateOpenCellIDMarkers = "update_open_cell_markers"; From 252e306a12e3fdc8f5510870a8a708c8d9093bce Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 14:11:48 +0100 Subject: [PATCH 52/82] more logging --- .../AIMSICD/adapters/AIMSICDDbAdapter.java | 99 ++++++++++--------- .../AIMSICD/fragments/AboutFragment.java | 9 +- .../AIMSICD/fragments/AtCommandFragment.java | 28 +++--- .../AIMSICD/fragments/DeviceFragment.java | 8 +- .../SecUpwN/AIMSICD/receiver/SmsReceiver.java | 15 +-- 5 files changed, 85 insertions(+), 74 deletions(-) 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 3015767d8..9db95a708 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java @@ -10,7 +10,6 @@ import android.database.sqlite.SQLiteOpenHelper; import android.os.Vibrator; import android.preference.PreferenceManager; -import android.util.Log; import android.util.SparseArray; import com.SecUpwN.AIMSICD.AIMSICD; @@ -36,6 +35,8 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.CSVWriter; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; /** * Description: @@ -132,7 +133,7 @@ public final class AIMSICDDbAdapter extends SQLiteOpenHelper { // TODO: This should be implemented as a SharedPreference... private static final Boolean MONO_DB_DUMP = true; // Also back-up DB with one monolithic dump file? - private static final String TAG = "AIMSICDDbAdapter"; + private final Logger log = AndroidLogger.forClass(AIMSICDDbAdapter.class); private static final String DB_NAME = "aimsicd.db"; private String[] mTables; @@ -195,10 +196,10 @@ public boolean createDataBase() { this.getReadableDatabase(); try { copyDataBase(); - Log.i(TAG, "Database created"); + log.info( "Database created"); return true; } catch (IOException e) { - Log.e(TAG, "Error creating database", e); + log.error( "Error creating database", e); throw new Error("Error copying database", e); } @@ -216,10 +217,10 @@ private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { - Log.i(TAG, "Checking for db first install this will throw an error on install and is normal"); + log.info( "Checking for db first install this will throw an error on install and is normal"); checkDB = SQLiteDatabase.openDatabase(mDatabasePath, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { - Log.e(TAG, "database not yet created", e); + log.error( "database not yet created", e); } if (checkDB != null) { @@ -287,7 +288,7 @@ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { * @return result of deleting that CID */ public int deleteCell(int cellId) { - Log.i(TAG, "Deleted CID: " + cellId); + log.info( "Deleted CID: " + cellId); // TODO Instead we need to delete this cell from DBi_measure, since: // we are using foreign_key enforced DB, that doesn't allow you to // remove Dbi_bts without corresponding DBi_measures that uses them. @@ -386,14 +387,14 @@ public boolean checkLAC(Cell cell) { while (bts_cursor.moveToNext()) { // 1=LAC, 8=Accuracy, 11=Time if (cell.getLAC() != bts_cursor.getInt(bts_cursor.getColumnIndex("LAC"))) { - Log.i(TAG, "ALERT: Changing LAC on CID: " + cell.getCID() + log.info( "ALERT: Changing LAC on CID: " + cell.getCID() + " LAC(API): " + cell.getLAC() + " LAC(DBi): " + bts_cursor.getInt(bts_cursor.getColumnIndex("LAC"))); bts_cursor.close(); return false; } else { - Log.v(TAG, "LAC checked - no change on CID:" + cell.getCID() + log.verbose( "LAC checked - no change on CID:" + cell.getCID() + " LAC(API): " + cell.getLAC() + " LAC(DBi): " + bts_cursor.getInt(bts_cursor.getColumnIndex("LAC"))); } @@ -527,7 +528,7 @@ public boolean prepareOpenCellUploadData() { csvWrite.writeNext("mcc,mnc,lac,cellid,lon,lat,signal,measured_at,rating"); int size = c.getCount(); - Log.d(TAG, "OCID UPLOAD: row count = " + size); + log.debug( "OCID UPLOAD: row count = " + size); while (c.moveToNext()) { csvWrite.writeNext( @@ -550,7 +551,7 @@ public boolean prepareOpenCellUploadData() { c.close(); return false; } catch (Exception e) { - Log.e(TAG, "prepareOpenCellUploadData(): Error creating OpenCellID Upload Data: ", e); + log.error( "prepareOpenCellUploadData(): Error creating OpenCellID Upload Data: ", e); return false; } } @@ -642,7 +643,7 @@ public boolean populateDBeImport() { if (!csvCellID.isEmpty()) { int lines = csvCellID.size(); - Log.i(TAG, "UpdateOpenCellID: OCID CSV size (lines): " + lines); + log.info( "UpdateOpenCellID: OCID CSV size (lines): " + lines); // TODO: WHAT IS THIS DOING?? (Why is it needed?) // This counts how many CIDs we have in DBe_import @@ -715,14 +716,14 @@ public boolean populateDBeImport() { ); } AIMSICD.mProgressBar.setProgress(4); - Log.d(TAG, "PopulateDBeImport(): inserted " + rowCounter + " cells."); + log.debug( "PopulateDBeImport(): inserted " + rowCounter + " cells."); } } else { - Log.e(TAG, "Opencellid.csv file does not exist!"); + log.error( "Opencellid.csv file does not exist!"); } return true; } catch (Exception e) { - Log.e(TAG, "Error parsing OpenCellID data: " + e.getMessage()); + log.error( "Error parsing OpenCellID data: " + e.getMessage()); return false; } finally { try { @@ -780,7 +781,7 @@ public boolean restoreDB() { records.get(i)[4] // lon ); } catch (Exception ee) { - Log.e(TAG, "RestoreDB: Error in insertDefaultLocation()", ee); + log.error( "RestoreDB: Error in insertDefaultLocation()", ee); } break; @@ -836,7 +837,7 @@ public boolean restoreDB() { 0 //Integer.parseInt(records.get(i)[16]) // TODO: rej_cause ); } catch (Exception ee) { - Log.e(TAG, "RestoreDB: Error in insertDBeImport()", ee); + log.error( "RestoreDB: Error in insertDBeImport()", ee); } break; @@ -857,7 +858,7 @@ public boolean restoreDB() { Double.parseDouble(records.get(i)[12]) // lon ); } catch (Exception ee) { - Log.e(TAG, "RestoreDB: Error in insertBTS()", ee); + log.error( "RestoreDB: Error in insertBTS()", ee); } break; @@ -889,7 +890,7 @@ public boolean restoreDB() { //records.get(i)[23].toString() // TODO: con_state ); } catch (Exception ee) { - Log.e(TAG, "RestoreDB: Error in insertDbiMeasure()", ee); + log.error( "RestoreDB: Error in insertDbiMeasure()", ee); } break; @@ -957,10 +958,10 @@ public boolean restoreDB() { } } } - Log.i(TAG, "RestoreDB() Finished"); + log.info( "RestoreDB() Finished"); return true; } catch (Exception e) { - Log.e(TAG, "RestoreDB() Error", e); + log.error( "RestoreDB() Error", e); return false; } finally { AIMSICD.mProgressBar.setProgress(0); @@ -1008,13 +1009,13 @@ private void dumpDB() { String execString = "/system/xbin/sqlite3 " + aimdir + "aimsicd.db '.backup " + file + "'"; try { - Log.i(TAG, "DumpDB() Attempting to dump DB to: " + file + "\nUsing: \"" + execString + "\"\n"); + log.info( "DumpDB() Attempting to dump DB to: " + file + "\nUsing: \"" + execString + "\"\n"); CMDProcessor.runSuCommand(execString); // We need SU for this... AIMSICD.mProgressBar.setProgress(2); } catch (Exception e) { - Log.e(TAG, "DumpDB() Failed to export DB dump file: ", e); + log.error( "DumpDB() Failed to export DB dump file: ", e); } - Log.i(TAG, "DumpDB() Dumped internal database to: " + aimdir + file); + log.info( "DumpDB() Dumped internal database to: " + aimdir + file); AIMSICD.mProgressBar.setProgress(0); } @@ -1038,7 +1039,7 @@ public boolean backupDB() { } return true; } catch (Exception ioe) { - Log.e(TAG, "BackupDB() Error: ", ioe); + log.error( "BackupDB() Error: ", ioe); return false; } } @@ -1054,20 +1055,20 @@ public boolean backupDB() { * @param tableName String representing table name to export */ private void backup(String tableName) { - Log.i(TAG, "Database Backup: " + DB_NAME); + log.info( "Database Backup: " + DB_NAME); File dir = new File(mExternalFilesDirPath); if (!dir.exists()) { if (!dir.mkdirs()) { - Log.e(TAG, "Backup(): Cannot create directory structure to " + dir.getAbsolutePath()); + log.error( "Backup(): Cannot create directory structure to " + dir.getAbsolutePath()); } } // We should probably add some more error handling here. File file = new File(dir, "aimsicd-" + tableName + ".csv"); try { - Log.i(TAG, "Backup(): Backup file was created? " + file.createNewFile()); + log.info( "Backup(): Backup file was created? " + file.createNewFile()); CSVWriter csvWrite = new CSVWriter(new FileWriter(file)); - Log.d(TAG, "DB backup() tableName: " + tableName); + log.debug( "DB backup() tableName: " + tableName); Cursor c = mDb.rawQuery("SELECT * FROM " + tableName, new String[0]); @@ -1085,9 +1086,9 @@ private void backup(String tableName) { c.close(); } catch (Exception e) { - Log.e(TAG, "Error exporting table: " + tableName, e); + log.error( "Error exporting table: " + tableName, e); } - Log.i(TAG, "Backup(): Successfully exported DB table to: " + file); + log.info( "Backup(): Successfully exported DB table to: " + file); } @@ -1155,7 +1156,7 @@ public void checkDBe() { //=== DELETE bad cells from BTS data //============================================================= - Log.d(TAG, "CheckDBe() Attempting to delete bad import data from DBe_import table..."); + log.debug( "CheckDBe() Attempting to delete bad import data from DBe_import table..."); // =========== samples =========== sqlQuery = "DELETE FROM DBe_import WHERE samples < 1"; @@ -1195,7 +1196,7 @@ public void checkDBe() { mDb.execSQL(sqlQuery); // SELECT count(*) from DBe_import; - Log.i(TAG, "CheckDBe() Deleted BTS entries from DBe_import table with bad LAC/CID..."); + log.info("CheckDBe() Deleted BTS entries from DBe_import table with bad LAC/CID..."); //============================================================= //=== UPDATE "rej_cause" in BTS data (DBe_import) @@ -1240,7 +1241,7 @@ public void checkDBe() { */ public void cleanseCellStrengthTables(long maxTime) { - Log.d(TAG, "CleanseCellStrengthTables(): Cleaning DBi_measure WHERE time < " + maxTime); + log.debug("CleanseCellStrengthTables(): Cleaning DBi_measure WHERE time < " + maxTime); //TODO Change "time" to INTEGER in DB -- currently not working String query = String.format( @@ -1301,7 +1302,7 @@ public boolean deleteDetectedSms(long deleteme) { mDb.delete("SmsData", "_id=" + deleteme, null); return true; } catch (Exception ee) { - Log.i(TAG, mTAG + ": Deleting SMS data failed", ee); + log.info(mTAG + ": Deleting SMS data failed", ee); } return false; } @@ -1312,7 +1313,7 @@ public boolean deleteDetectionString(String deleteme) { mDb.delete("DetectionStrings", "det_str='" + deleteme + "'", null); return true; } catch (Exception ee) { - Log.i(TAG, "Deleting detection string failed", ee); + log.info("Deleting detection string failed", ee); } return false; @@ -1350,14 +1351,14 @@ public boolean insertNewDetectionString(ContentValues newString) { cursor.close(); if (exists) { - Log.i(TAG, "Detection String already in Database"); + log.info("Detection String already in Database"); } else { try { mDb.insert("DetectionStrings", null, newString); - Log.i(TAG, "New detection string added."); + log.info("New detection string added."); return true; } catch (Exception ee) { - Log.i(TAG, "Adding detection string Failed! ", ee); + log.info("Adding detection string Failed! ", ee); } } return false; @@ -1753,7 +1754,7 @@ public void insertBTS(Cell cell) { mDb.insert("DBi_bts", null, values); - Log.i(TAG, "DBi_bts was populated."); + log.info("DBi_bts was populated."); } else { // If cell is already in the DB, update it to last time seen and @@ -1776,7 +1777,7 @@ public void insertBTS(Cell cell) { // update (String table, ContentValues values, String whereClause, String[] whereArgs) mDb.update("DBi_bts", values, "CID=?", new String[]{Integer.toString(cell.getCID())}); - Log.i(TAG, "DBi_bts updated: CID=" + cell.getCID() + " LAC=" + cell.getLAC()); + log.info("DBi_bts updated: CID=" + cell.getCID() + " LAC=" + cell.getLAC()); } // TODO: This doesn't make sense, if it's in DBi_bts it IS part of DBi_measure! @@ -1810,7 +1811,7 @@ public void insertBTS(Cell cell) { dbiMeasure.put("isNeighbour", 0); mDb.insert("DBi_measure", null, dbiMeasure); - Log.i(TAG, "DBi_measure inserted bts_id=" + cell.getCID()); // TODO: NO!! + log.info("DBi_measure inserted bts_id=" + cell.getCID()); // TODO: NO!! } else { // Updating DBi_measure tables if already exists. @@ -1859,7 +1860,7 @@ public void insertBTS(Cell cell) { //dbiMeasure.put("AvgEcNo",AvgEcNo); // TODO: I need to check this... mDb.update("DBi_measure", dbiMeasure, "bts_id=?", new String[]{Integer.toString(cell.getCID())}); - Log.i(TAG, "DBi_measure updated bts_id=" + cell.getCID()); + log.info("DBi_measure updated bts_id=" + cell.getCID()); } @@ -1905,7 +1906,7 @@ public void insertBTS(int mcc, int mnc, int lac, int cid, int psc, int t3212, in // has changed. At the moment this is only PSC, since we don't have the others... // ======================================================================= mDb.update("DBi_bts", btsValues, "CID=?", new String[]{Integer.toString(cid)}); - Log.i(TAG, "Warning: Physical cell data in DBi_bts has changed! CID=" + cid); + log.info("Warning: Physical cell data in DBi_bts has changed! CID=" + cid); } } @@ -2114,10 +2115,10 @@ public void insertEventLog(String time, eventLog.put("DF_description", DF_description); mDb.insert("EventLog", null, eventLog); - Log.i(TAG, "InsertEventLog(): Insert detection event into EventLog table with CID=" + cid); + log.info("InsertEventLog(): Insert detection event into EventLog table with CID=" + cid); } else { // TODO This may need to be removed as it may spam the logcat buffer... - Log.v(TAG, "InsertEventLog(): Skipped inserting duplicate event into EventLog table with CID=" + cid); + log.verbose("InsertEventLog(): Skipped inserting duplicate event into EventLog table with CID=" + cid); } } } @@ -2165,7 +2166,7 @@ public void toEventLog(int DF_id, String DF_desc) { eventLog.put("DF_description", DF_desc); // DF_desc mDb.insert("EventLog", null, eventLog); - Log.i(TAG, "ToEventLog(): Added new event: id=" + DF_id + " time=" + time + " cid=" + cid); + log.info("ToEventLog(): Added new event: id=" + DF_id + " time=" + time + " cid=" + cid); // Short 100 ms Vibration // TODO not elegant solution, vibrator invocation should be moved somewhere else imho @@ -2184,11 +2185,11 @@ public void toEventLog(int DF_id, String DF_desc) { } // else { // TODO This may need to be removed as it may spam the logcat buffer... - //Log.v(TAG, mTAG + ":toEventLog(): Skipped inserting duplicate event"); + //log.verbose(mTAG + ":toEventLog(): Skipped inserting duplicate event"); // } } // TODO This may need to be removed as it may spam the logcat buffer... - //Log.v(TAG, mTAG + ":insertEventLog(): Skipped inserting bad CID/LAC data"); + //log.verbose(mTAG + ":insertEventLog(): Skipped inserting bad CID/LAC data"); } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index fe48c1854..69cf14a89 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -16,7 +16,6 @@ import android.support.annotation.StringRes; import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,9 +26,13 @@ import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.activities.CreditsRollActivity; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + public class AboutFragment extends Fragment { - private static final String TAG = "Aboutfragment"; + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(AboutFragment.class); private Context mContext; private Button btncredits; @@ -50,7 +53,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } catch (PackageManager.NameNotFoundException e) { //Woops something went wrong?? // so what do we do then? // YES!! LOG THE EXCEPTION ~agilob - Log.e(TAG, "Something went wrong", e); + log.error("Something went wrong", e); version = ""; } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java index bf3da2815..6f302f994 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java @@ -13,7 +13,6 @@ import android.os.Message; import android.support.v4.app.Fragment; import android.text.Editable; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -38,6 +37,9 @@ import java.util.ArrayList; import java.util.List; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: This is the AT Command Interface or AT Command Processor (ATCoP) that @@ -70,7 +72,7 @@ */ public class AtCommandFragment extends Fragment { - private static final String TAG = "AtCommandFrag"; + private final Logger log = AndroidLogger.forClass(AtCommandFragment.class); //Return value constants private static final int SERIAL_INIT_OK = 100; @@ -215,7 +217,7 @@ private class btnClick implements View.OnClickListener { public void onClick(View v) { if (mAtCommand.getText() != null) { String command = mAtCommand.getText().toString(); - Log.i(TAG, "AT Command Detected: " + command); + log.info("AT Command Detected: " + command); executeAT(); } } @@ -276,7 +278,7 @@ private int initSerialDevice() { mSerialDevices.add(mSerialDevice); } } catch (StringIndexOutOfBoundsException e) { - Log.w(TAG, e.getMessage()); + log.warn(e.getMessage()); // ignore, move on } @@ -334,7 +336,7 @@ public void commandOutput(int id, String line) { } } catch (Exception e) { - Log.e(TAG, "InitSerialDevice ", e); + log.error("InitSerialDevice ", e); } if (!mSerialDevices.isEmpty()) { @@ -379,7 +381,7 @@ private void executeAT() { // We need a device-type check here, perhaps: gsm.version.ril-impl. Editable cmd = mAtCommand.getText(); if (cmd != null && cmd.length() != 0) { - Log.d(TAG, "ExecuteAT: attempting to send: " + cmd.toString()); + log.debug("ExecuteAT: attempting to send: " + cmd.toString()); if (getSerialDevice() != null) { mCommandTerminal.send(cmd.toString(), new Handler(Looper.getMainLooper()) { @@ -422,26 +424,26 @@ private void commandWait(Shell shell, Command cmd) throws Exception { cmd.wait(mTimeout); } } catch (InterruptedException e) { - Log.e(TAG, e.getMessage()); + log.error(e.getMessage()); } } if (!cmd.isExecuting() && !cmd.isFinished()) { Exception e = new Exception(); if (!shell.isExecuting && !shell.isReading) { - Log.w(TAG, "Waiting for a command to be executed in a shell that is not executing and not reading! \n\n Command: " + cmd.getCommand()); + log.warn("Waiting for a command to be executed in a shell that is not executing and not reading! \n\n Command: " + cmd.getCommand()); e.setStackTrace(Thread.currentThread().getStackTrace()); - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); } else if (shell.isExecuting && !shell.isReading) { - Log.e(TAG, "Waiting for a command to be executed in a shell that is executing but not reading! \n\n Command: " + cmd.getCommand()); + log.error("Waiting for a command to be executed in a shell that is executing but not reading! \n\n Command: " + cmd.getCommand()); e.setStackTrace(Thread.currentThread().getStackTrace()); - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); } else { - Log.e(TAG, "Waiting for a command to be executed in a shell that is not reading! \n\n Command: " + cmd.getCommand()); + log.error("Waiting for a command to be executed in a shell that is not reading! \n\n Command: " + cmd.getCommand()); e.setStackTrace(Thread.currentThread().getStackTrace()); - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); } } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java index 016d19869..f675bd591 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java @@ -16,7 +16,6 @@ import android.os.IBinder; import android.support.v4.app.Fragment; import android.telephony.TelephonyManager; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,9 +28,12 @@ import com.SecUpwN.AIMSICD.widget.HighlightTextView; import com.kaichunlin.transition.animation.AnimationManager; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + public class DeviceFragment extends Fragment { - private final String TAG = "AIMSICD"; + private final Logger log = AndroidLogger.forClass(DeviceFragment.class); private View mView; @@ -103,7 +105,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName arg0) { - Log.e(TAG, "Service Disconnected"); + log.error("Service Disconnected"); mBound = false; } }; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java b/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java index ef532affd..d1180a676 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java @@ -10,13 +10,15 @@ import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; -import android.util.Log; import com.SecUpwN.AIMSICD.service.CellTracker; import java.util.ArrayList; import java.util.List; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: The SMS receiver class that handles the SMS PDU data @@ -67,6 +69,8 @@ */ public class SmsReceiver extends BroadcastReceiver { + private final Logger log = AndroidLogger.forClass(SmsReceiver.class); + public void onReceive(Context context, Intent intent) { try { final Bundle bundle = intent.getExtras(); @@ -87,7 +91,7 @@ public void onReceive(Context context, Intent intent) { } full_pdu_string = sb.toString(); } catch (Exception err) { - Log.e("SmsReceiver", "Exception PDU smsReceiver" + err); + log.error("Exception PDU smsReceiver" + err); } // We may also need to consider catching WAP PUSH SMS messages @@ -97,8 +101,7 @@ public void onReceive(Context context, Intent intent) { //int mms = firstByte & 0x4; // 4 = 0000 0100 (bit 3) //int sri = firstByte & 0x10; // 16 = 0001 0000 (bit 5) int pID = smsPdu[1] & 0xc0; // 192 = 1100 0000 - Log.i("AIMSICD_SmsReceiver", "PDU Data: firstByte: " + firstByte + - " TP-MTI: " + mti + " TP-PID: " + pID); + log.info("PDU Data: firstByte: " + firstByte + " TP-MTI: " + mti + " TP-PID: " + pID); // Need checking! --EVA if (pID == 0x40 && mti == 0) { messages.add(SmsMessage.createFromPdu((byte[]) pdu)); @@ -116,14 +119,14 @@ public void onReceive(Context context, Intent intent) { smsData.putString("message", sms.getMessageBody()); smsIntent.putExtras(smsData); context.sendBroadcast(smsIntent); - Log.i("AIMSICD_SmsReceiver", "Type-0 SMS received! Sender: " + log.info("Type-0 SMS received! Sender: " + sms.getOriginatingAddress() + " Message: " + sms.getMessageBody()); } } } } catch (NullPointerException npe) { - Log.e("SmsReceiver", "Exception smsReceiver" + npe); + log.error("Exception smsReceiver", npe); } } From fc82b51b4fedb2e27c8dac33325ba8e9246c06b2 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 15:32:43 +0100 Subject: [PATCH 53/82] adjust Logging in Services --- .../AIMSICD/service/AimsicdService.java | 15 ++++--- .../SecUpwN/AIMSICD/service/CellTracker.java | 44 ++++++++++--------- .../AIMSICD/service/LocationTracker.java | 18 ++++---- .../service/SignalStrengthTracker.java | 31 +++++++------ 4 files changed, 57 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java index 99be4b48a..6bc55ee8f 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java @@ -35,7 +35,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.util.Log; import android.view.WindowManager; import com.SecUpwN.AIMSICD.R; @@ -44,6 +43,9 @@ import com.SecUpwN.AIMSICD.utils.Cell; import com.SecUpwN.AIMSICD.utils.GeoLocation; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: This starts the (background?) AIMSICD service to check for SMS and track * cells with or without GPS enabled. @@ -51,7 +53,8 @@ */ public class AimsicdService extends Service { - private static final String TAG = "AimsicdService"; + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(AimsicdService.class); // /data/data/com.SecUpwN.AIMSICD/shared_prefs/com.SecUpwN.AIMSICD_preferences.xml public static final String SHARED_PREFERENCES_BASENAME = "com.SecUpwN.AIMSICD_preferences"; @@ -119,7 +122,7 @@ public void run() { mRilExecutor = new RilExecutor(this); mCellTracker = new CellTracker(this, signalStrengthTracker); - Log.i(TAG, "Service launched successfully."); + log.info("Service launched successfully."); } @Override @@ -138,7 +141,7 @@ public void onDestroy() { if (SmsDetector.getSmsDetectionState()) { smsdetector.stopSmsDetection(); } - Log.i(TAG, "Service destroyed."); + log.info("Service destroyed."); } public GeoLocation lastKnownLocation() { @@ -189,7 +192,7 @@ public boolean isSmsTracking() { public void startSmsTracking() { if(!isSmsTracking()) { - Log.i(TAG, "Sms Detection Thread Started"); + log.info("Sms Detection Thread Started"); smsdetector = new SmsDetector(this); smsdetector.startSmsDetection(); } @@ -198,7 +201,7 @@ public void startSmsTracking() { public void stopSmsTracking() { if(isSmsTracking()) { smsdetector.stopSmsDetection(); - Log.i(TAG, "Sms Detection Thread Stopped"); + log.info("Sms Detection Thread Stopped"); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java index 042573f17..a123433a0 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java @@ -26,7 +26,6 @@ import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; -import android.util.Log; import com.SecUpwN.AIMSICD.AIMSICD; import com.SecUpwN.AIMSICD.BuildConfig; @@ -45,6 +44,9 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: Class to handle tracking of cell information * @@ -83,7 +85,7 @@ public class CellTracker implements SharedPreferences.OnSharedPreferenceChangeListener{ - private static final String TAG = "CellTracker"; + private final Logger log = AndroidLogger.forClass(CellTracker.class); public static Cell mMonitorCell; public static String OCID_API_KEY = null; // see getOcidKey() @@ -355,7 +357,7 @@ public List updateNeighbouringCells() { //if nclp = true then check for neighboringCellInfo if (neighboringCellInfo != null && neighboringCellInfo.size() == 0 && nclp) { - Log.i(TAG, "NeighbouringCellInfo is empty: start polling..."); + log.info("NeighbouringCellInfo is empty: start polling..."); // Try to poll the neighboring cells for a few seconds neighboringCellBlockingQueue = new LinkedBlockingQueue<>(100); // TODO What is this ?? @@ -376,14 +378,14 @@ public List updateNeighbouringCells() { // TODO: Consider removing ?? for (int i = 0; i < 10 && neighboringCellInfo.size() == 0; i++) { try { - Log.d(TAG, "NeighbouringCellInfo empty: trying " + i); + log.debug("NeighbouringCellInfo empty: trying " + i); NeighboringCellInfo info = neighboringCellBlockingQueue.poll(1, TimeUnit.SECONDS); if (info == null) { neighboringCellInfo = tm.getNeighboringCellInfo(); if(neighboringCellInfo != null) if (neighboringCellInfo.size() > 0) { // Can we think of a better log message here? - Log.d(TAG, "NeighbouringCellInfo found on " + i + " try. (time based)"); + log.debug("NeighbouringCellInfo found on " + i + " try. (time based)"); break; } else { continue; @@ -405,11 +407,11 @@ public List updateNeighbouringCells() { //commented because I got NPE here // TODO: Who are you?? --EVA - //Log.d(TAG, mTAG + ": neighbouringCellInfo size: " + neighboringCellInfo.size()); + //log.debug(mTAG + ": neighbouringCellInfo size: " + neighboringCellInfo.size()); // Add NC list to DBi_measure:nc_list for (NeighboringCellInfo neighbourCell : neighboringCellInfo) { - Log.i(TAG, "NeighbouringCellInfo -" + + log.info("NeighbouringCellInfo -" + " LAC:" + neighbourCell.getLac() + " CID:" + neighbourCell.getCid() + " PSC:" + neighbourCell.getPsc() + @@ -460,7 +462,7 @@ public List updateNeighbouringCells() { * */ public void checkForNeighbourCount(CellLocation location){ - Log.i(TAG, "CheckForNeighbourCount()"); + log.info("CheckForNeighbourCount()"); Integer ncls = 0; // NC list size if(tm != null && tm.getNeighboringCellInfo() != null) // See # 383 @@ -468,20 +470,20 @@ public void checkForNeighbourCount(CellLocation location){ Boolean nclp = tinydb.getBoolean("nc_list_present"); // NC list present? (default is false) if (ncls > 0) { - Log.d(TAG, "NeighbouringCellInfo size: " + ncls ); + log.debug("NeighbouringCellInfo size: " + ncls ); if (!nclp) { - Log.d(TAG, "Setting nc_list_present to: true"); + log.debug("Setting nc_list_present to: true"); tinydb.putBoolean("nc_list_present", true); } } else if (ncls == 0 && nclp) { // Detection 7a - Log.i(TAG, "ALERT: No neighboring cells detected for CID: " + mDevice.mCell.getCID()); + log.info("ALERT: No neighboring cells detected for CID: " + mDevice.mCell.getCID()); vibrate(100, Status.Type.MEDIUM); dbHelper.toEventLog(4,"No neighboring cells detected"); // (DF_id, DF_desc) } else { // Todo: remove cid string when working. - Log.d(TAG, "NC list not supported by AOS on this device. Nothing to do."); - Log.d(TAG, ": Setting nc_list_present to: false"); + log.debug("NC list not supported by AOS on this device. Nothing to do."); + log.debug(": Setting nc_list_present to: false"); tinydb.putBoolean("nc_list_present", false); } } @@ -568,7 +570,7 @@ public void compareLac(CellLocation location){ if (!dbHelper.openCellExists(mMonitorCell.getCID())) { dbHelper.toEventLog(2, "CID not in DBe_import"); - Log.i(TAG, "ALERT: Connected to unknown CID not in DBe_import: " + mMonitorCell.getCID()); + log.info("ALERT: Connected to unknown CID not in DBe_import: " + mMonitorCell.getCID()); vibrate(100, Status.Type.MEDIUM); mCellIdNotInOpenDb = true; @@ -618,7 +620,7 @@ private void handlePhoneStateChange() { return; } - Log.i(TAG, "NeighbouringCellInfo empty - event based polling succeeded!"); + log.info("NeighbouringCellInfo empty - event based polling succeeded!"); tm.listen(phoneStatelistener, PhoneStateListener.LISTEN_NONE); if(neighboringCellInfo == null) neighboringCellInfo = new ArrayList<>(); @@ -1131,7 +1133,7 @@ public void startTrackingFemto() { mTrackingFemtocell = true; mPhoneStateListener = new PhoneStateListener() { public void onServiceStateChanged(ServiceState s) { - Log.d(TAG, context.getString(R.string.service_state_changed)); + log.debug(context.getString(R.string.service_state_changed)); getServiceStateInfo(s); } }; @@ -1148,7 +1150,7 @@ public void stopTrackingFemto() { tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); mTrackingFemtocell = false; setNotification(); - Log.v(TAG, context.getString(R.string.stopped_tracking_femtocell)); + log.verbose(context.getString(R.string.stopped_tracking_femtocell)); } } @@ -1196,11 +1198,11 @@ private boolean IsConnectedToCdmaFemto(ServiceState s) { return !((networkID < FEMTO_NID_MIN) || (networkID >= FEMTO_NID_MAX)); } else { - Log.v(TAG, "Cell location info is null."); + log.verbose("Cell location info is null."); return false; } } else { - Log.v(TAG, "Telephony Manager is null."); + log.verbose("Telephony Manager is null."); return false; } } @@ -1219,11 +1221,11 @@ private boolean IsConnectedToCdmaFemto(ServiceState s) { int FEMTO_NID_MIN = 0xfa; return !((networkID < FEMTO_NID_MIN) || (networkID >= FEMTO_NID_MAX)); } else { - Log.v(TAG, "Cell location info is null."); + log.verbose("Cell location info is null."); return false; } } else { - Log.v(TAG, "Telephony Manager is null."); + log.verbose("Telephony Manager is null."); return false; } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java b/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java index 7a8fc9051..051b5079e 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java @@ -13,7 +13,6 @@ import android.location.LocationManager; import android.os.Build; import android.os.Bundle; -import android.util.Log; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; @@ -21,12 +20,15 @@ import com.SecUpwN.AIMSICD.utils.GeoLocation; import com.SecUpwN.AIMSICD.utils.TruncatedLocation; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Class to handle GPS location tracking */ public final class LocationTracker { - private static final String TAG = "LocationTracker"; + private final Logger log = AndroidLogger.forClass(LocationTracker.class); // how long with no movement detected, before we assume we are not moving public static final long MOVEMENT_THRESHOLD_MS = 20 * 1000; @@ -59,21 +61,21 @@ public void start() { lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_MIN_UPDATE_TIME, GPS_MIN_UPDATE_DISTANCE, mLocationListener); } catch (IllegalArgumentException e) { - Log.d(TAG, "GPS location provider doesnt exist"); + log.debug("GPS location provider doesnt exist"); } try { lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, GPS_MIN_UPDATE_TIME, GPS_MIN_UPDATE_DISTANCE, mLocationListener); } catch (IllegalArgumentException e) { - Log.d(TAG, "Passive location provider doesnt exist"); + log.debug("Passive location provider doesnt exist"); } try { lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, GPS_MIN_UPDATE_TIME, GPS_MIN_UPDATE_DISTANCE, mLocationListener); } catch (IllegalArgumentException e) { - Log.d(TAG, "Network location provider doesnt exist"); + log.debug("Network location provider doesnt exist"); } } @@ -126,21 +128,21 @@ public GeoLocation lastKnownLocation() { try { Cell cell = context.getCell(); if (cell != null) { - Log.d("location", "Looking up MCC " + cell.getMCC()); + log.debug("Looking up MCC " + cell.getMCC()); double[] defLoc = mDbHelper.getDefaultLocation(cell.getMCC()); loc = GeoLocation.fromDegrees(defLoc[0], defLoc[1]); } } catch (Exception e) { - Log.e("location", "Unable to get location from MCC", e); + log.error("Unable to get location from MCC", e); } } } } if (loc != null) - Log.i("location", "Last known location " + loc.toString()); + log.info("Last known location " + loc.toString()); return loc; } 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 c7a2abdec..58f1867df 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java @@ -6,12 +6,14 @@ package com.SecUpwN.AIMSICD.service; import android.content.Context; -import android.util.Log; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; import java.util.HashMap; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: Class that calculates cell signal strength averages and decides if a * given cell + strength appears to be mysteriously (low or high). @@ -72,7 +74,7 @@ * * ChangeLog * - * 20150703 E:V:A Changed log TAG to use only TAG for Log.i() and mTAG for Log.d/e/v() + * 20150703 E:V:A Changed log TAG to use only TAG for log.info() and mTAG for log.debug/e/v() * 20150717 E:V:A Added back mTAG's and added comments * 20150719 E:V:A Added comments * @@ -80,8 +82,7 @@ */ public class SignalStrengthTracker { - private static final String TAG = "AIMSICD"; - private static final String mTAG = "SignalStrengthTracker"; + private final Logger log = AndroidLogger.forClass(SignalStrengthTracker.class); private static int sleepTimeBetweenSignalRegistration = 60; // [seconds] private static int minimumIdleTime = 30; // [seconds] @@ -119,17 +120,15 @@ public void registerSignalStrength(int cellID, int signalStrength) { // TODO: We probably need to convert this into seconds for easy use in DB long now = System.currentTimeMillis(); // [ms] - if(deviceIsMoving()) { - Log.i(TAG, mTAG + - ": Ignored signal sample for CID: " + cellID + - " due to device movement. Waiting for " + ((minimumIdleTime*1000) - (now - lastMovementDetected)) + " ms."); + if (deviceIsMoving()) { + log.info("Ignored signal sample for CID: " + cellID + + " due to device movement. Waiting for " + ((minimumIdleTime * 1000) - (now - lastMovementDetected)) + " ms."); return; } if( now - (sleepTimeBetweenSignalRegistration*1000) > lastRegistrationTime) { long diff = now - lastRegistrationTime; - Log.i(TAG, mTAG + - ": Scheduling signal strength calculation from CID: " + cellID + + log.info("Scheduling signal strength calculation from CID: " + cellID + " @ " + signalStrength + " dBm. Last registration was " + diff + "ms ago."); lastRegistrationTime = now; @@ -138,7 +137,7 @@ public void registerSignalStrength(int cellID, int signalStrength) { } if( now - (sleepTimeBetweenCleanup*1000) > lastCleanupTime) { - Log.i(TAG, mTAG + ": Removing old signal strength entries from DB."); + log.info("Removing old signal strength entries from DB."); // cleanupOldData();// // TODO cleanupOldData() need to change query as now time is a string value @@ -173,7 +172,7 @@ public boolean isMysterious(int cellID, int signalStrength) { // If moving, return false if(deviceIsMoving()) { - Log.i(TAG, mTAG + ": Cannot check signal strength for CID: " + cellID + " because of device movements."); + log.info("Cannot check signal strength for CID: " + cellID + " because of device movements."); return false; } @@ -182,12 +181,12 @@ public boolean isMysterious(int cellID, int signalStrength) { // Cached? if(averageSignalCache.get(cellID) != null) { storedAvg = averageSignalCache.get(cellID); - Log.d(TAG, mTAG + ": Cached average SS for CID: " + cellID + " is: " + storedAvg); + log.debug("Cached average SS for CID: " + cellID + " is: " + storedAvg); } else { // Not cached, check DB storedAvg = mDbHelper.getAverageSignalStrength(cellID); // DBi_measure:rx_signal averageSignalCache.put(cellID, storedAvg); - Log.d(TAG, mTAG + ": Average SS in DB for CID: " + cellID + " is: " + storedAvg); + log.debug("Average SS in DB for CID: " + cellID + " is: " + storedAvg); } boolean result; @@ -196,13 +195,13 @@ public boolean isMysterious(int cellID, int signalStrength) { } else { result = signalStrength - storedAvg > mysteriousSignalDifference; } - Log.d(TAG, mTAG + ": Signal Strength mystery check for CID: " + cellID + + log.debug("Signal Strength mystery check for CID: " + cellID + " is " + result + ", avg:" + storedAvg + ", this signal: " + signalStrength); return result; } public void onSensorChanged() { - //Log.d(TAG, "We are moving..."); + //log.debug(TAG, "We are moving..."); lastMovementDetected = System.currentTimeMillis(); } } From fde2b918b753c5febb921b2a983e4275264c39da Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 16:47:00 +0100 Subject: [PATCH 54/82] even more logging --- .../java/com/SecUpwN/AIMSICD/AIMSICD.java | 27 ++++--- .../java/com/SecUpwN/AIMSICD/AppAIMSICD.java | 39 +++++----- .../receiver/BootCompletedReceiver.java | 8 +- .../AIMSICD/rilexecutor/RilExecutor.java | 18 +++-- .../SamsungMulticlientRilExecutor.java | 74 ++++++++++--------- .../service/SignalStrengthTracker.java | 2 +- .../smsdetection/AdvancedUserActivity.java | 15 ++-- .../smsdetection/AdvancedUserSmsActivity.java | 19 +++-- .../AIMSICD/smsdetection/SmsDetector.java | 36 ++++----- .../SecUpwN/AIMSICD/utils/CMDProcessor.java | 7 +- .../SecUpwN/AIMSICD/utils/ChildProcess.java | 19 ++--- .../SecUpwN/AIMSICD/utils/CommandResult.java | 14 ++-- .../com/SecUpwN/AIMSICD/utils/Device.java | 20 ++--- .../SecUpwN/AIMSICD/utils/DeviceApi17.java | 11 ++- .../SecUpwN/AIMSICD/utils/DeviceApi18.java | 16 ++-- .../com/SecUpwN/AIMSICD/utils/Helpers.java | 22 +++--- .../com/SecUpwN/AIMSICD/utils/MiscUtils.java | 10 ++- .../SecUpwN/AIMSICD/utils/OemCommands.java | 12 +-- .../SecUpwN/AIMSICD/utils/RequestTask.java | 34 +++++---- .../utils/SystemPropertiesReflection.java | 18 +++-- .../AIMSICD/utils/TruncatedLocation.java | 8 +- .../utils/atcmd/AtCommandTerminal.java | 9 ++- .../AIMSICD/utils/atcmd/TtyPrivFile.java | 6 +- .../AIMSICD/utils/atcmd/TtyStream.java | 11 ++- 24 files changed, 247 insertions(+), 208 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java b/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java index a5e92d887..beefa5103 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java @@ -22,7 +22,9 @@ import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.telephony.TelephonyManager; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -74,7 +76,8 @@ */ public class AIMSICD extends BaseActivity implements AsyncResponse { - private final String TAG = "AIMSICD"; + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(AIMSICD.class); private final Context mContext = this; private boolean mBound; @@ -327,7 +330,7 @@ void selectItem(int position) { cell.setMCC(Integer.parseInt(networkOperator.substring(0, 3))); int mnc = Integer.parseInt(networkOperator.substring(3)); cell.setMNC(Integer.parseInt(networkOperator.substring(3, 5))); - Log.d(TAG, "CELL:: mcc=" + mcc + " mnc=" + mnc); + log.debug("CELL:: mcc=" + mcc + " mnc=" + mnc); } @@ -415,12 +418,12 @@ public void onResponse(Response response) throws IOException { mAimsicdService.stopSmsTracking(); } } catch (Exception ee) { - Log.w(TAG, "Exception in smstracking module: " + ee.getMessage()); + log.warn("Exception in smstracking module: " + ee.getMessage()); } if (mAimsicdService != null) mAimsicdService.onDestroy(); //Close database on Exit - Log.i(TAG, "Closing db from DrawerMenu.ID.APPLICATION.QUIT"); + log.info("Closing db from DrawerMenu.ID.APPLICATION.QUIT"); new AIMSICDDbAdapter(getApplicationContext()).close(); finish(); } @@ -438,7 +441,7 @@ public void onResponse(Response response) throws IOException { @Override public void processFinish(float[] location) { - Log.i(TAG, "processFinish - location[0]=" + location[0] + " location[1]=" + location[1]); + log.info("processFinish - location[0]=" + location[0] + " location[1]=" + location[1]); if (Float.floatToRawIntBits(location[0]) == 0 @@ -455,7 +458,7 @@ public void processFinish(List cells) { if (cells != null) { if (!cells.isEmpty()) { for (Cell cell : cells) { - Log.i(TAG, "processFinish - Cell =" + cell.toString()); + log.info("processFinish - Cell =" + cell.toString()); if (cell.isValid()) { mAimsicdService.setCell(cell); Intent intent = new Intent(AimsicdService.UPDATE_DISPLAY); @@ -501,7 +504,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName arg0) { - Log.w(TAG, "Service disconnected"); + log.warn("Service disconnected"); mBound = false; } }; @@ -621,10 +624,10 @@ public void onBackPressed() { mAimsicdService.stopSmsTracking(); } } catch (Exception ee) { - Log.e(TAG, "Error: Stopping SMS detection : " + ee.getMessage()); + log.error("Error: Stopping SMS detection : " + ee.getMessage()); } // Close database on Exit - Log.i(TAG, "Closing db from onBackPressed()"); + log.info("Closing db from onBackPressed()"); new AIMSICDDbAdapter(getApplicationContext()).close(); finish(); } @@ -637,11 +640,11 @@ private void SmsDetection() { if (root_sms && !mAimsicdService.isSmsTracking()) { mAimsicdService.startSmsTracking(); Helpers.msgShort(mContext, "SMS Detection Started"); - Log.i(TAG, "SMS Detection Thread Started"); + log.info("SMS Detection Thread Started"); } else if (!root_sms && mAimsicdService.isSmsTracking()) { mAimsicdService.stopSmsTracking(); Helpers.msgShort(mContext, "Sms Detection Stopped"); - Log.i(TAG, "SMS Detection Thread Stopped"); + log.info("SMS Detection Thread Stopped"); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java b/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java index 29e4ecd51..1bb4c8936 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java @@ -8,23 +8,25 @@ import android.app.Activity; import android.app.Application; -import android.util.Log; import android.util.SparseArray; import com.SecUpwN.AIMSICD.constants.TinyDbKeys; import com.SecUpwN.AIMSICD.utils.BaseAsyncTask; import com.SecUpwN.AIMSICD.utils.TinyDB; -import com.squareup.okhttp.Cache; import com.squareup.okhttp.OkHttpClient; -// DO NOT REMOVE BELOW COMMENTED-OUT CODE BEFORE ASKING! -//import com.squareup.leakcanary.LeakCanary; import java.util.ArrayList; import java.util.List; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + +// DO NOT REMOVE BELOW COMMENTED-OUT CODE BEFORE ASKING! +//import com.squareup.leakcanary.LeakCanary; + public class AppAIMSICD extends Application { - final static String TAG = "AIMSICD"; - final static String mTAG = "AppAIMSICD"; + + private final Logger log = AndroidLogger.forClass(AppAIMSICD.class); private OkHttpClient okHttpClient; @@ -57,9 +59,8 @@ public void removeTask(BaseAsyncTask pTask) { for (BaseAsyncTask lTask : tasks) { if (lTask.equals(pTask)) { tasks.remove(lTask); - if (BuildConfig.DEBUG) { - Log.v(TAG, mTAG + ": BaseTask removed:" + pTask.toString()); - } + log.verbose("BaseTask removed:" + pTask.toString()); + break; } } @@ -74,18 +75,16 @@ public void addTask(Activity activity, BaseAsyncTask pTask) { if (activity == null) { return; } - if (BuildConfig.DEBUG) { - Log.d(TAG, mTAG + ": BaseTask addTask activity:" + activity.getClass().getCanonicalName()); - } + + log.debug("BaseTask addTask activity:" + activity.getClass().getCanonicalName()); + int key = activity.getClass().getCanonicalName().hashCode(); List> tasks = mActivityTaskMap.get(key); if (tasks == null) { tasks = new ArrayList<>(); mActivityTaskMap.put(key, tasks); } - if (BuildConfig.DEBUG) { - Log.v(TAG, mTAG + ": BaseTask added:" + pTask.toString()); - } + log.verbose("BaseTask added:" + pTask.toString()); tasks.add(pTask); } @@ -93,9 +92,8 @@ public void detach(Activity activity) { if (activity == null) { return; } - if (BuildConfig.DEBUG) { - Log.d(TAG, mTAG + ": BaseTask detach:" + activity.getClass().getCanonicalName()); - } + + log.debug("BaseTask detach:" + activity.getClass().getCanonicalName()); List> tasks = mActivityTaskMap.get(activity.getClass().getCanonicalName().hashCode()); if (tasks != null) { @@ -109,9 +107,8 @@ public void attach(Activity activity) { if (activity == null) { return; } - if (BuildConfig.DEBUG) { - Log.d(TAG, mTAG + ": BaseTask attach:" + activity.getClass().getCanonicalName()); - } + log.debug("BaseTask attach:" + activity.getClass().getCanonicalName()); + List> tasks = mActivityTaskMap.get(activity.getClass().getCanonicalName().hashCode()); if (tasks != null) { for (BaseAsyncTask task : tasks) { diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java b/app/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java index c0151df87..da9bfad47 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java @@ -9,13 +9,17 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.service.AimsicdService; public class BootCompletedReceiver extends BroadcastReceiver { + private final Logger log = AndroidLogger.forClass(BootCompletedReceiver.class); + @Override public void onReceive(Context context, Intent intent) { SharedPreferences prefs = context.getSharedPreferences( @@ -23,7 +27,7 @@ public void onReceive(Context context, Intent intent) { final String AUTO_START = context.getString(R.string.pref_autostart_key); boolean mAutoStart = prefs.getBoolean(AUTO_START, false); if (mAutoStart) { - Log.i("AIMSICD", "System booted starting service."); + log.info("System booted starting service."); context.startService(new Intent(context, AimsicdService.class)); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java b/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java index 116be4955..5ed49785e 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java @@ -11,7 +11,9 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import com.SecUpwN.AIMSICD.utils.Helpers; import com.SecUpwN.AIMSICD.utils.OemCommands; @@ -27,8 +29,8 @@ * Class to handle Ril and Samsung MultiRil implementation. Used by the Aimsicd Service. */ public class RilExecutor { - protected static final String TAG = "AIMSICD"; - protected static final String mTAG = "RilExecutor"; + + private final Logger log = AndroidLogger.forClass(RilExecutor.class); public boolean mMultiRilCompatible; @@ -78,7 +80,7 @@ public RilExecutor(Context context) { mRilExecutorDetectResult = mRequestExecutor.detect(); if (!mRilExecutorDetectResult.available) { mMultiRilCompatible = false; - Log.e(TAG, mTAG + ": Samsung Multiclient RIL not available: " + mRilExecutorDetectResult.error); + log.error("Samsung Multiclient RIL not available: " + mRilExecutorDetectResult.error); mRequestExecutor = null; } else { mRequestExecutor.start(); @@ -144,7 +146,7 @@ private synchronized List executeServiceModeCommand(int type, int subtyp subtype, keySeqence).sendToTarget(); if (!mRequestCondvar.block(timeout)) { - Log.e(TAG, mTAG + ": request timeout"); + log.error("request timeout"); return Collections.emptyList(); } else { synchronized (mLastResponseLock) { @@ -250,15 +252,15 @@ public boolean handleMessage(Message msg) { try { RawResult result = (RawResult) msg.obj; if (result == null) { - Log.e(TAG, mTAG + ": result is null"); + log.error("result is null"); break; } if (result.exception != null) { - Log.e(TAG, mTAG + ": ", result.exception); + log.error("", result.exception); break; } if (result.result == null) { - Log.v(TAG, mTAG + ": No need to refresh."); + log.verbose("No need to refresh"); break; } if (lastKeyStep.captureResponse) { diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java b/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java index e6fda8332..5750066ca 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java @@ -20,7 +20,9 @@ import android.net.LocalSocketAddress; import android.os.Message; import android.os.Parcel; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import java.io.IOException; import java.io.InputStream; @@ -40,7 +42,7 @@ */ public class SamsungMulticlientRilExecutor implements OemRilExecutor { - private static final String TAG = "SamsungMulticlientRil"; + private final Logger log = AndroidLogger.forClass(SamsungMulticlientRilExecutor.class); private static final String MULTICLIENT_SOCKET = "Multiclient"; private static final int RIL_REQUEST_OEM_RAW = 59; private static final int RIL_REQUEST_OEM_STRINGS = 60; @@ -67,7 +69,7 @@ public DetectResult detect() { Method method = clazz.getDeclaredMethod("get", String.class, String.class); gsmVerRilImpl = (String) method.invoke(null, "gsm.version.ril-impl", ""); } catch (Exception ignore) { - Log.d(TAG, "ignore this exception?", ignore); + log.debug("ignore this exception?", ignore); } // E:V:A comment out for debugging purposes on other non-Samsung RILS @@ -81,14 +83,14 @@ public DetectResult detect() { try { s.connect(new LocalSocketAddress(MULTICLIENT_SOCKET)); } catch (IOException e) { - Log.w(TAG, e.getMessage()); + log.warn(e.getMessage()); return DetectResult.Unavailable( "Multiclient socket is not available\n" + "gsm.version.ril-impl = " + gsmVerRilImpl); } finally { try { s.close(); } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); } } @@ -98,7 +100,7 @@ public DetectResult detect() { @Override public synchronized void start() { if (mThread != null) { - Log.e(TAG, "OEM raw request executor thread is running"); + log.error("OEM raw request executor thread is running"); return; } mThread = new LocalSocketThread(MULTICLIENT_SOCKET); @@ -108,7 +110,7 @@ public synchronized void start() { @Override public synchronized void stop() { if (mThread == null) { - Log.e(TAG, "OEM raw request executor thread is not running"); + log.error("OEM raw request executor thread is not running"); return; } mThread.cancel(); @@ -118,26 +120,26 @@ public synchronized void stop() { @Override public synchronized void invokeOemRilRequestRaw(byte[] data, Message response) { if (mThread == null) { - Log.e(TAG, " OEM raw request executor thread is not running"); + log.error(" OEM raw request executor thread is not running"); return; } try { mThread.invokeOemRilRequestRaw(data, response); } catch (IOException ioe) { - Log.e(TAG, "InvokeOemRilRequestRaw() error", ioe); + log.error("InvokeOemRilRequestRaw() error", ioe); } } @Override public synchronized void invokeOemRilRequestStrings(String[] strings, Message response) { if (mThread == null) { - Log.e(TAG, "OEM raw request executor thread is not running"); + log.error("OEM raw request executor thread is not running"); return; } try { mThread.invokeOemRilRequestStrings(strings, response); } catch (IOException ioe) { - Log.e(TAG, "InvokeOemRilRequestStrings() error", ioe); + log.error("InvokeOemRilRequestStrings() error", ioe); } } @@ -162,7 +164,7 @@ public LocalSocketThread(String socketPath) { public void cancel() { if (DBG) { - Log.v(TAG, "SamsungMulticlientRil cancel()"); + log.verbose("SamsungMulticlientRil cancel()"); } synchronized (this) { mCancelRequested.set(true); @@ -175,12 +177,12 @@ public synchronized void invokeOemRilRequestRaw(byte[] data, Message response) throws IOException { int token; if (mMessages.size() > MAX_MESSAGES) { - Log.e(TAG, "message queue is full"); + log.error("message queue is full"); return; } if (mOutputStream == null) { - Log.e(TAG, "Local write() error: not connected"); + log.error("Local write() error: not connected"); return; } @@ -191,8 +193,8 @@ public synchronized void invokeOemRilRequestRaw(byte[] data, Message response) byte req[] = marshallRequest(token, data); if (DBG) { - Log.v(TAG, String.format("InvokeOemRilRequestRaw() token: 0x%X, header: %s, req: %s ", - token, HexDump.toHexString(getHeader(req)),HexDump.toHexString(req)) + log.verbose(String.format("InvokeOemRilRequestRaw() token: 0x%X, header: %s, req: %s ", + token, HexDump.toHexString(getHeader(req)), HexDump.toHexString(req)) ); } @@ -205,12 +207,12 @@ public synchronized void invokeOemRilRequestStrings(String strings[], Message re throws IOException { int token; if (mMessages.size() > MAX_MESSAGES) { - Log.e(TAG, "Message queue is full"); + log.error("Message queue is full"); return; } if (mOutputStream == null) { - Log.e(TAG, "Local write() error: not connected"); + log.error("Local write() error: not connected"); return; } @@ -221,7 +223,7 @@ public synchronized void invokeOemRilRequestStrings(String strings[], Message re byte[] req = marshallRequest(token, strings); if (DBG) { - Log.v(TAG, String.format("InvokeOemRilRequestStrings() token: 0x%X, header: %s, req: %s ", + log.verbose(String.format("InvokeOemRilRequestStrings() token: 0x%X, header: %s, req: %s ", token, HexDump.toHexString(getHeader(req)), HexDump.toHexString(req))); } @@ -263,7 +265,7 @@ private byte[] marshallRequest(int token, String strings[]) { public synchronized void disconnect() { if (DBG) { - Log.v(TAG, "Local disconnect()"); + log.verbose("Local disconnect()"); } if (mSocket == null) { @@ -273,31 +275,31 @@ public synchronized void disconnect() { try { mSocket.shutdownInput(); } catch (IOException e) { - Log.e(TAG, "Local shutdownInput() of mSocket failed", e); + log.error("Local shutdownInput() of mSocket failed", e); } try { mSocket.shutdownOutput(); } catch (IOException e) { - Log.e(TAG, "Local shutdownOutput() of mSocket failed", e); + log.error("Local shutdownOutput() of mSocket failed", e); } try { mInputStream.close(); } catch (IOException e) { - Log.e(TAG, "Local close() of mInputStream failed", e); + log.error("Local close() of mInputStream failed", e); } try { mOutputStream.close(); } catch (IOException e) { - Log.e(TAG, "Local close() of mOutputStream failed", e); + log.error("Local close() of mOutputStream failed", e); } try { mSocket.close(); } catch (IOException e) { - Log.e(TAG, "Local close() of mSocket failed", e); + log.error("Local close() of mSocket failed", e); } mSocket = null; @@ -312,7 +314,7 @@ public void run() { int endpos = 0; final byte buf[] = new byte[4096]; - Log.i(TAG, "BEGIN LocalSocketThread-Socket"); + log.info("BEGIN LocalSocketThread-Socket"); setName("MultiClientThread"); mSocket = new LocalSocket(); @@ -321,7 +323,7 @@ public void run() { mInputStream = mSocket.getInputStream(); mOutputStream = mSocket.getOutputStream(); } catch (IOException e) { - Log.e(TAG, "Connect error", e); + log.error("Connect error", e); return; } @@ -330,7 +332,7 @@ public void run() { rcvd = mInputStream.read(buf, endpos, buf.length - endpos); if (rcvd < 0) { if (DBG) { - Log.v(TAG, "EOF reached"); + log.verbose("EOF reached"); } break; } @@ -341,7 +343,7 @@ public void run() { int msgLen = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | (buf[3] & 0xff); if (msgLen + 4 > buf.length) { - Log.e(TAG, "Message to big. Length: " + msgLen); + log.error("Message to big. Length: " + msgLen); endpos = 0; continue; } @@ -369,7 +371,7 @@ private synchronized void processRxPacket(byte data[], int pos, int length) { Parcel p; if (DBG) { - Log.v(TAG, "Received " + length + " bytes: " + + log.verbose("Received " + length + " bytes: " + HexDump.toHexString(data, pos, length)); } @@ -381,13 +383,13 @@ private synchronized void processRxPacket(byte data[], int pos, int length) { responseType = p.readInt(); switch (responseType) { case RESPONSE_UNSOLICITED: - Log.v(TAG, "Unsolicited response "); + log.verbose("Unsolicited response "); break; case RESPONSE_SOLICITED: processSolicited(p); break; default: - Log.v(TAG, "Invalid response type: " + responseType); + log.verbose("Invalid response type: " + responseType); break; } } finally { @@ -406,7 +408,7 @@ private int processSolicited(Parcel p) { int err = p.readInt(); if (DBG) { - Log.v(TAG, String.format(": processSolicited() token: 0x%X err: %d", token, err)); + log.verbose(String.format(": processSolicited() token: 0x%X err: %d", token, err)); } if (err != RIL_CLIENT_ERR_SUCCESS) { @@ -417,12 +419,12 @@ private int processSolicited(Parcel p) { stringsResponseData = p.createStringArray(); } catch (Exception ex) { - Log.e(TAG, ex.getMessage()); + log.error(ex.getMessage()); errorEx = ex; } if (token == null) { - Log.e(TAG, "token is null", errorEx); + log.error("token is null", errorEx); } else { synchronized (this) { Message m = mMessages.remove(token); @@ -440,7 +442,7 @@ private int processSolicited(Parcel p) { m.sendToTarget(); } } else { - Log.i(TAG, "Message with token " + token + " not found"); + log.info("Message with token " + token + " not found"); } } } 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 58f1867df..302321bb2 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java @@ -201,7 +201,7 @@ public boolean isMysterious(int cellID, int signalStrength) { } public void onSensorChanged() { - //log.debug(TAG, "We are moving..."); + //log.debug("We are moving..."); lastMovementDetected = System.currentTimeMillis(); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java index 983bab41b..19f2ae37c 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java @@ -11,7 +11,6 @@ import android.content.ContentValues; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.Button; @@ -26,9 +25,13 @@ import java.util.ArrayList; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + public class AdvancedUserActivity extends AppCompatActivity { - private static final String TAG = "AdvancedUserActivity"; + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(AdvancedUserActivity.class); private ListView listViewAdv; private AIMSICDDbAdapter dbAccess; @@ -51,7 +54,7 @@ protected void onCreate(Bundle savedInstanceState) { try { msgItems = dbAccess.getDetectionStrings(); } catch (Exception ee) { - Log.e(TAG, "Database error", ee); + log.error("Database error", ee); msgItems = new ArrayList<>(); AdvanceUserItems advUserItems = new AdvanceUserItems(); advUserItems.setDetection_string("NO DATA"); @@ -80,7 +83,7 @@ public boolean onItemLongClick(AdapterView a, View v, int position, long id) try { loadDbString(); } catch (Exception ee){ - Log.d(TAG, "Error loading db string", ee); + log.debug("Error loading db string", ee); } return false; } @@ -113,7 +116,7 @@ public void onClick(View view) { try { loadDbString(); } catch (Exception ee) { - Log.e(TAG, ee.getMessage(), ee); + log.error(ee.getMessage(), ee); } } } @@ -130,7 +133,7 @@ public void loadDbString(){ newmsglist = dbAccess.getDetectionStrings(); listViewAdv.setAdapter(new AdvanceUserBaseAdapter(getApplicationContext(), newmsglist)); } catch (Exception ee) { - Log.e(TAG, "", ee); + log.error("", ee); } } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java index cbfb11f5b..e675d24da 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java @@ -11,7 +11,6 @@ import android.database.Cursor; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; @@ -23,8 +22,14 @@ import java.util.ArrayList; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + public class AdvancedUserSmsActivity extends AppCompatActivity { - final static String TAG ="AdvancedUserSmsActivity"; + + //TODO: @Inject + private final Logger log = AndroidLogger.forClass(AdvancedUserSmsActivity.class); + ListView listViewAdv; AIMSICDDbAdapter dbaccess; ArrayList msgitems; @@ -59,8 +64,8 @@ protected void onCreate(Bundle savedInstanceState) { } smscur.close(); - }catch (Exception ee){ - Log.e(TAG, "DB ERROR>>>>" + ee.toString()); + } catch (Exception ee) { + log.error("DB ERROR", ee); } @@ -111,9 +116,9 @@ public void loadDbString(){ } smscur.close(); - listViewAdv.setAdapter(new AdvanceUserBaseSmsAdapter(getApplicationContext(),newmsglist)); - }catch (Exception ee){ - Log.e(TAG, "DB ERROR>>>>" + ee.toString()); + listViewAdv.setAdapter(new AdvanceUserBaseSmsAdapter(getApplicationContext(), newmsglist)); + } catch (Exception ee) { + log.error("DB ERROR", ee); } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java index a1530b740..685741b8b 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java @@ -13,7 +13,6 @@ import android.os.IBinder; import android.support.annotation.StringRes; import android.support.v7.app.AlertDialog; -import android.util.Log; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; @@ -28,6 +27,9 @@ import java.util.ArrayList; import java.util.List; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: Detects mysterious SMS by scraping Logcat entries. *

@@ -59,7 +61,7 @@ */ public final class SmsDetector extends Thread { - private final static String TAG = "SmsDetector"; + private final Logger log = AndroidLogger.forClass(SmsDetector.class); private BufferedReader mLogcatReader; private AimsicdService mAIMSICDService; @@ -119,7 +121,7 @@ public void startSmsDetection() { Intent intent = new Intent(mContext, AimsicdService.class); mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); start(); - Log.i(TAG, "SMS detection started"); + log.info("SMS detection started"); } public void stopSmsDetection() { @@ -129,7 +131,7 @@ public void stopSmsDetection() { mContext.unbindService(mConnection); mBound = false; } - Log.i(TAG, "SMS detection stopped"); + log.info("SMS detection stopped"); } @Override @@ -150,7 +152,7 @@ public void run() { mLogcatReader = new BufferedReader(new InputStreamReader(process.getInputStream())); } catch (InterruptedException | IOException e) { - Log.e(TAG, "Exception while initializing LogCat (time, radio, main) reader", e); + log.error("Exception while initializing LogCat (time, radio, main) reader", e); return; } @@ -230,16 +232,16 @@ public void run() { } } catch (IOException e) { - Log.e(TAG, "IO Exception", e); + log.error("IO Exception", e); } catch (InterruptedException e) { - Log.e(TAG, "Interrupted Exception", e); + log.error("Interrupted Exception", e); } } try { mLogcatReader.close(); } catch (IOException ee) { - Log.e(TAG, "IOE Error closing BufferedReader", ee); + log.error("IOE Error closing BufferedReader", ee); } } @@ -250,26 +252,26 @@ private int checkForSms(String line) { // memory optimized and precaution for LOADED_DETECTION_STRING being not filled String[] splitDetectionString = LOADED_DETECTION_STRING == null ? null : LOADED_DETECTION_STRING.split("#"); if (splitDetectionString == null || splitDetectionString.length < 2 || splitDetectionString[0] == null || splitDetectionString[1] == null) { - Log.d(TAG, "Broken detection string: " + LOADED_DETECTION_STRING); + log.debug("Broken detection string: " + LOADED_DETECTION_STRING); // skip broken detection string continue; } if (line.contains(splitDetectionString[0])) { if ("TYPE0".equalsIgnoreCase(splitDetectionString[1])) { - Log.i(TAG, "TYPE0 detected"); + log.info("TYPE0 detected"); return TYPE0; } else if ("MWI".equalsIgnoreCase(splitDetectionString[1])) { - Log.i(TAG, "MWI detected"); + log.info("MWI detected"); return MWI; } else if ("WAPPUSH".equalsIgnoreCase(splitDetectionString[1])) { - Log.i(TAG, "WAPPUSH detected"); + log.info("WAPPUSH detected"); return WAP; } } // This is currently unused, but keeping as an example of possible data contents // else if (line.contains("BroadcastReceiver action: android.provider.Telephony.SMS_RECEIVED")) { - // Log.i(TAG, "SMS found"); + // log.info("SMS found"); // return 0; // } } @@ -304,7 +306,7 @@ private void parseTypeZeroSms(String[] bufferLines, String logcat_timestamp) { mDbAdapter.toEventLog(3, "Detected Type-0 SMS"); startPopUpInfo(SmsType.SILENT); } else { - Log.d(TAG, "Detected Sms already logged"); + log.debug("Detected Sms already logged"); } } @@ -336,7 +338,7 @@ private void parseMwiSms(String[] logcatLines, String logcat_timestamp) { mDbAdapter.toEventLog(4, "Detected MWI SMS"); startPopUpInfo(SmsType.MWI); } else { - Log.d(TAG, " Detected Sms already logged"); + log.debug(" Detected Sms already logged"); } } @@ -366,7 +368,7 @@ private void parseWapPushSms(String[] logcatLines, String[] postWapMessageLines, mDbAdapter.toEventLog(6, "Detected WAPPUSH SMS"); startPopUpInfo(SmsType.WAP_PUSH); } else { - Log.d(TAG, "Detected SMS already logged"); + log.debug("Detected SMS already logged"); } } @@ -439,7 +441,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { @Override public void onServiceDisconnected(ComponentName arg0) { - Log.i(TAG, "Disconnected SMS Detection Service"); + log.info("Disconnected SMS Detection Service"); mBound = false; } }; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java index 3e643ca79..b7326ebae 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java @@ -21,11 +21,12 @@ package com.SecUpwN.AIMSICD.utils; -import android.util.Log; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; public final class CMDProcessor { - private static final String TAG = "CMDProcessor"; + private static final Logger log = AndroidLogger.forClass(CMDProcessor.class); public CMDProcessor() { @@ -78,7 +79,7 @@ public static boolean canSU() { out.append(r.getStdout()); out.append(" ; "); out.append(r.getStderr()); - Log.d(TAG, "canSU() su[" + r.getExitValue() + "]: " + out); + log.debug("canSU() su[" + r.getExitValue() + "]: " + out); return r.success(); } } \ No newline at end of file diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java index 3d3d67451..d3bde1ad0 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java @@ -21,17 +21,18 @@ package com.SecUpwN.AIMSICD.utils; -import android.util.Log; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + import static java.lang.System.nanoTime; public class ChildProcess { - private static final String TAG = "ChildProcess"; + private final Logger log = AndroidLogger.forClass(ChildProcess.class); private static final int PIPE_SIZE = 1024; private class ChildReader extends Thread { @@ -53,12 +54,12 @@ public void run() { mBuffer.append(s); } } catch (IOException e) { - Log.d(TAG, e.getMessage()); + log.debug(e.getMessage()); } try { mStream.close(); } catch (IOException e) { - Log.d(TAG, "cannot close stream", e); + log.debug("cannot close stream", e); } } } @@ -83,12 +84,12 @@ public void run() { off += len; } } catch (IOException e) { - Log.d(TAG, e.getMessage()); + log.debug(e.getMessage()); } try { mStream.close(); } catch (IOException e) { - Log.d(TAG, "cannot close stream", e); + log.debug("cannot close stream", e); } } } @@ -120,7 +121,7 @@ public ChildProcess(String[] cmdarray, String childStdin) { mChildStderrReader = new ChildReader(mChildProc.getErrorStream(), mChildStderr); mChildStderrReader.start(); } catch (IOException e) { - Log.d(TAG, e.getMessage(), e); + log.debug(e.getMessage(), e); } } @@ -151,7 +152,7 @@ public int waitFinished() { mChildStdinWriter = null; } } catch (InterruptedException e) { - Log.d(TAG, e.getMessage(), e); + log.debug(e.getMessage(), e); } } return mExitValue; diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java index 0d1c43ea3..8ca039a9e 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java @@ -23,7 +23,6 @@ import android.os.Parcel; import android.os.Parcelable; -import android.util.Log; import com.SecUpwN.AIMSICD.adapters.AIMSICDDbAdapter; @@ -31,10 +30,13 @@ import java.io.FileWriter; import java.io.IOException; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + @SuppressWarnings("AccessOfSystemProperties") public class CommandResult implements Parcelable { - private static final String TAG = "AIMSICD_CommandResult"; + private final Logger log = AndroidLogger.forClass(CommandResult.class); private long mStartTime; private int mExitValue; private String mStdout; @@ -49,7 +51,7 @@ public CommandResult(long startTime, int exitValue, this.mStderr = stderr; this.mEndTime = endTime; - Log.d(TAG, "Time to execute: " + (mEndTime - mStartTime) + " ns (nanoseconds)"); + log.debug("Time to execute: " + (mEndTime - mStartTime) + " ns (nanoseconds)"); // this is set last so log from here checkForErrors(); } @@ -101,20 +103,20 @@ private void checkForErrors() { errorWriter.write(lineEnding); errorWriter.write("Attempted to write to an offline cpu core (ignore me)."); } else { - errorWriter.write(TAG + " shell error detected!"); + errorWriter.write("shell error detected!"); errorWriter.write(lineEnding); errorWriter.write("CommandResult {" + this.toString() + '}'); errorWriter.write(lineEnding); } errorWriter.write(lineEnding); } catch (IOException e) { - Log.e(TAG, "Failed to write command result to error file", e); + log.error("Failed to write command result to error file", e); } finally { if (errorWriter != null) { try { errorWriter.close(); } catch (IOException ignored) { - Log.e(TAG, "Failed to close error writer", ignored); + log.error("Failed to close error writer", ignored); } } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java index f0d947660..a4e97804c 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java @@ -11,7 +11,9 @@ import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; /** * Description: TODO @@ -27,7 +29,7 @@ */ public class Device { - private final String TAG = "Device"; + private final Logger log = AndroidLogger.forClass(Device.class); public Cell mCell; private int mPhoneID = -1; @@ -84,7 +86,7 @@ public void refreshDeviceInfo(TelephonyManager tm, Context context) { if (mCell.getMNC() == Integer.MAX_VALUE) mCell.setMNC(Integer.parseInt(tm.getNetworkOperator().substring(3, 5))); } catch (Exception e) { - Log.i(TAG, "MncMcc parse exception: ", e); + log.info("MncMcc parse exception: ", e); } } mNetName = tm.getNetworkOperatorName(); @@ -120,7 +122,7 @@ public void refreshDeviceInfo(TelephonyManager tm, Context context) { if (mCell.getMNC() == Integer.MAX_VALUE) mCell.setMNC(Integer.valueOf(homeOperator.substring(3, 5))); } catch (Exception e) { - Log.i(TAG, "HomeOperator parse exception - " + e.getMessage(), e); + log.info("HomeOperator parse exception - " + e.getMessage(), e); } } } @@ -184,7 +186,7 @@ String getSimCountry(TelephonyManager tm) { } catch (Exception e) { // SIM methods can cause Exceptions on some devices mSimCountry = "N/A"; - Log.e(TAG, "GetSimCountry " + e); + log.error("GetSimCountry " + e); } if (mSimCountry.isEmpty()) { @@ -216,7 +218,7 @@ public String getSimOperator(TelephonyManager tm) { } catch (Exception e) { // SIM methods can cause Exceptions on some devices mSimOperator = "N/A"; - Log.e(TAG, "GetSimOperator " + e.getMessage(), e); + log.error("GetSimOperator " + e.getMessage(), e); } if (mSimOperator.isEmpty()) { @@ -243,7 +245,7 @@ String getSimOperatorName(TelephonyManager tm) { mSimOperatorName = "N/A"; } } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); //SIM methods can cause Exceptions on some devices mSimOperatorName = "N/A"; } @@ -274,7 +276,7 @@ String getSimSubs(TelephonyManager tm) { } catch (Exception e) { //Some devices don't like this method mSimSubs = "N/A"; - Log.e(TAG, "GetSimSubs "+e.getMessage(), e); + log.error("GetSimSubs "+e.getMessage(), e); } if (mSimSubs.isEmpty()) { @@ -304,7 +306,7 @@ String getSimSerial(TelephonyManager tm) { } catch (Exception e) { // SIM methods can cause Exceptions on some devices mSimSerial = "N/A"; - Log.e(TAG, "GetSimSerial " + e); + log.error("GetSimSerial " + e); } if (mSimSerial.isEmpty()) { diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java index 2c52f1725..8ae9fb123 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java @@ -22,10 +22,12 @@ import android.telephony.CellSignalStrengthWcdma; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; -import android.util.Log; import java.util.List; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: TODO * @@ -33,7 +35,8 @@ */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public class DeviceApi17 { - public static final String TAG = "DeviceApi17"; + + private static final Logger log = AndroidLogger.forClass(DeviceApi17.class); public static void loadCellInfo(TelephonyManager tm, Device pDevice) { int lCurrentApiVersion = android.os.Build.VERSION.SDK_INT; @@ -103,7 +106,7 @@ public static void loadCellInfo(TelephonyManager tm, Device pDevice) { pDevice.mCell.setPSC(identityWcdma.getPsc()); } else { - Log.i(TAG, "Unknown type of cell signal! " + log.info("Unknown type of cell signal! " + "ClassName: " + info.getClass().getSimpleName() + " ToString: " + info.toString()); } @@ -112,7 +115,7 @@ public static void loadCellInfo(TelephonyManager tm, Device pDevice) { } } } catch (NullPointerException npe) { - Log.e(TAG, "loadCellInfo: Unable to obtain cell signal information: ", npe); + log.error("loadCellInfo: Unable to obtain cell signal information: ", npe); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java index 776e91bfa..4b5368254 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java @@ -22,7 +22,9 @@ import android.telephony.CellSignalStrengthWcdma; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import java.util.List; @@ -49,8 +51,8 @@ */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public class DeviceApi18 { - public static final String TAG = "AIMSICD"; - public static final String mTAG = "DeviceApi18"; + + public static final Logger log = AndroidLogger.forClass(DeviceApi18.class); public static void loadCellInfo(TelephonyManager tm, Device pDevice) { int lCurrentApiVersion = android.os.Build.VERSION.SDK_INT; @@ -111,16 +113,16 @@ public static void loadCellInfo(TelephonyManager tm, Device pDevice) { pDevice.mCell.setPSC(identityWcdma.getPsc()); } else { - Log.i(TAG, mTAG + ": Unknown type of cell signal!" - + "\n ClassName: " + info.getClass().getSimpleName() - + "\n ToString: " + info.toString()); + log.info("Unknown type of cell signal!" + + "\n ClassName: " + info.getClass().getSimpleName() + + "\n ToString: " + info.toString()); } if (pDevice.mCell.isValid()) break; } } } catch (NullPointerException npe) { - Log.e(TAG, mTAG + ": loadCellInfo: Unable to obtain cell signal information: ", npe); + log.error("loadCellInfo: Unable to obtain cell signal information: ", npe); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java index b40ece7dc..113f8ccbf 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java @@ -25,7 +25,9 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.text.TextUtils; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.activities.MapViewerOsmDroid; @@ -75,7 +77,7 @@ */ public class Helpers { - private static final String TAG = "Helpers"; + private static final Logger log = AndroidLogger.forClass(Helpers.class); private static final int CHARS_PER_LINE = 34; /** @@ -141,7 +143,7 @@ public static Boolean isNetAvailable(Context context) { return wifiInfo.isConnected() || mobileInfo.isConnected(); } } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); } return false; } @@ -237,18 +239,18 @@ public static void getOpenCellData(Context context, Cell cell, char type) { + String.valueOf(boundingCoords[1].getLatitudeInDegrees()) + "," + String.valueOf(boundingCoords[1].getLongitudeInDegrees()); - Log.i(TAG, "OCID BBOX is set to: " + boundParameter + " with radius " + radius + " Km."); + log.info("OCID BBOX is set to: " + boundParameter + " with radius " + radius + " Km."); StringBuilder sb = new StringBuilder(); sb.append("http://www.opencellid.org/cell/getInArea?key=") .append(CellTracker.OCID_API_KEY).append("&BBOX=") .append(boundParameter); - Log.i(TAG, "OCID MCC is set to: " + cell.getMCC()); + log.info("OCID MCC is set to: " + cell.getMCC()); if (cell.getMCC() != Integer.MAX_VALUE) { sb.append("&mcc=").append(cell.getMCC()); } - Log.i(TAG, "OCID MNC is set to: " + cell.getMNC()); + log.info("OCID MNC is set to: " + cell.getMNC()); if (cell.getMNC() != Integer.MAX_VALUE) { sb.append("&mnc=").append(cell.getMNC()); } @@ -282,7 +284,7 @@ public static List unpackByteListOfStrings(byte aob[]) { if (aob.length == 0) { // WARNING: This one is very chatty! - Log.v(TAG, "invokeOemRilRequestRaw: byte-list response Length = 0"); + log.verbose("invokeOemRilRequestRaw: byte-list response Length = 0"); return Collections.emptyList(); } int lines = aob.length / CHARS_PER_LINE; @@ -294,13 +296,13 @@ public static List unpackByteListOfStrings(byte aob[]) { byteCount = 0; if (offset + byteCount >= aob.length) { - Log.e(TAG, "Unexpected EOF"); + log.error("Unexpected EOF"); break; } while (aob[offset + byteCount] != 0 && (byteCount < CHARS_PER_LINE)) { byteCount += 1; if (offset + byteCount >= aob.length) { - Log.e(TAG, "Unexpected EOF"); + log.error("Unexpected EOF"); break; } } @@ -318,7 +320,7 @@ public static String getSystemProp(Context context, String prop, String def) { try { result = SystemPropertiesReflection.get(context, prop); } catch (IllegalArgumentException iae) { - Log.e(TAG, "Failed to get system property: " + prop, iae); + log.error("Failed to get system property: " + prop, iae); } return result == null ? def : result; } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java index 03c43ed93..e1868c0c0 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java @@ -13,7 +13,9 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v4.app.NotificationCompat; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import com.SecUpwN.AIMSICD.AIMSICD; import com.SecUpwN.AIMSICD.R; @@ -37,7 +39,7 @@ */ public class MiscUtils { - private static final String TAG = "MiscUtils"; + private static final Logger log = AndroidLogger.forClass(MiscUtils.class); public static String setAssetsString(Context context){ BufferedReader reader = null; @@ -51,13 +53,13 @@ public static String setAssetsString(Context context){ rline = reader.readLine().replace("'","\\'").replace("\\n",""); } } catch (Exception ee) { - Log.e(TAG, ee.getMessage()); + log.error(ee.getMessage()); } finally { if(reader != null) { try { reader.close(); } catch (Exception ee) { - Log.e(TAG, ee.getMessage()); + log.error(ee.getMessage()); } } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java index a9db8f06c..53464191f 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java @@ -5,7 +5,8 @@ */ package com.SecUpwN.AIMSICD.utils; -import android.util.Log; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import com.SecUpwN.AIMSICD.R; @@ -22,7 +23,8 @@ */ public class OemCommands { - private static final String TAG = "AIMSICD_OemCommands"; + private static final Logger log = AndroidLogger.forClass(OemCommands.class); + public static final char OEM_SERVM_FUNCTAG = 1; public static final char OEM_SM_ACTION = 0; public static final char OEM_SM_QUERY = 1; @@ -106,7 +108,7 @@ public byte[] getEnterServiceModeData(int modeType, int subType, int query) { dos.writeByte(query); return baos.toByteArray(); } catch (IOException e) { - Log.e(TAG, "", e); + log.error("", e); } return null; } @@ -128,7 +130,7 @@ public byte[] getEndServiceModeData(int modeType) { dos.writeByte(modeType); return baos.toByteArray(); } catch (IOException e) { - Log.e(TAG, "", e); + log.error("", e); } return null; } @@ -151,7 +153,7 @@ public byte[] getPressKeyData(int keycode, int query) { dos.writeByte(query); return baos.toByteArray(); } catch (IOException e) { - Log.e(TAG, "", e); + log.error("", e); } return null; } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java index 2a33bafcf..a3c734713 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java @@ -10,7 +10,9 @@ import android.content.Context; import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import com.SecUpwN.AIMSICD.AIMSICD; import com.SecUpwN.AIMSICD.AppAIMSICD; @@ -98,7 +100,7 @@ public class RequestTask extends BaseAsyncTask { public static final char RESTORE_DATABASE = 4; // Restore DB from CSV files public static final char CELL_LOOKUP = 5; // TODO: "All Current Cell Details (ACD)" - public static final String TAG = "RequestTask"; + private final Logger log = AndroidLogger.forClass(RequestTask.class); private AIMSICDDbAdapter mDbAdapter; private Context mAppContext; @@ -125,7 +127,7 @@ protected String doInBackground(String... commandString) { try { boolean prepared = mDbAdapter.prepareOpenCellUploadData(); - Log.i(TAG, "OCID upload data prepared - " + String.valueOf(prepared)); + log.info("OCID upload data prepared - " + String.valueOf(prepared)); if (prepared) { File file = new File((mAppContext.getExternalFilesDir(null) + File.separator) + "OpenCellID/aimsicd-ocid-data.csv"); publishProgress(25, 100); @@ -147,7 +149,7 @@ protected String doInBackground(String... commandString) { publishProgress(80,100); if (response!= null) { - Log.i(TAG, "OCID Upload Response: " + log.info("OCID Upload Response: " + response.code() + " - " + response.message()); if (response.code() == 200) { @@ -163,13 +165,13 @@ protected String doInBackground(String... commandString) { // all caused by httpclient.execute(httppost); } catch (UnsupportedEncodingException e) { - Log.e(TAG, "Upload OpenCellID data Exception", e); + log.error("Upload OpenCellID data Exception", e); } catch (FileNotFoundException e) { - Log.e(TAG, "Upload OpenCellID data Exception", e); + log.error("Upload OpenCellID data Exception", e); } catch (IOException e) { - Log.e(TAG, "Upload OpenCellID data Exception", e); + log.error("Upload OpenCellID data Exception", e); } catch (Exception e) { - Log.e(TAG, "Upload OpenCellID data Exception", e); + log.error("Upload OpenCellID data Exception", e); } // DOWNLOADING... @@ -186,7 +188,7 @@ protected String doInBackground(String... commandString) { dir.mkdirs(); } File file = new File(dir, OCDB_File_Name); - Log.i(TAG, "DBE_DOWNLOAD_REQUEST write to: " + dirName + OCDB_File_Name); + log.info("DBE_DOWNLOAD_REQUEST write to: " + dirName + OCDB_File_Name); Request request = new Request.Builder() .url(commandString[0]) @@ -199,22 +201,22 @@ protected String doInBackground(String... commandString) { try { String error = response.body().string(); Helpers.msgLong(mAppContext, mAppContext.getString(R.string.download_error) + " " + error); - Log.e(TAG, "Download OCID data error: " + error); + log.error("Download OCID data error: " + error); } catch (Exception e) { Helpers.msgLong(mAppContext, mAppContext.getString(R.string.download_error) + " " + e.getClass().getName() + " - " + e.getMessage()); - Log.e(TAG, "Download OCID exception: ", e); + log.error("Download OCID exception: ", e); } return "Error"; } else { // This returns "-1" for streamed response (Chunked Transfer Encoding) total = response.body().contentLength(); if (total == -1 ) { - Log.d(TAG, "doInBackground DBE_DOWNLOAD_REQUEST total not returned!"); + log.debug("doInBackground DBE_DOWNLOAD_REQUEST total not returned!"); total = 1024; // Let's set it arbitrarily to something other than "-1" } else { - Log.d(TAG, "doInBackground DBE_DOWNLOAD_REQUEST total: " + total); + log.debug("doInBackground DBE_DOWNLOAD_REQUEST total: " + total); publishProgress((int) (0.25 * total), (int)total); // Let's show something! } @@ -236,7 +238,7 @@ protected String doInBackground(String... commandString) { return "Successful"; } catch (IOException e) { - Log.w(TAG, "Problem reading data from steam", e); + log.warn("Problem reading data from steam", e); return null; } @@ -265,7 +267,7 @@ protected void onPreExecute() { protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // Silence or Remove when working: - Log.v(TAG, "onProgressUpdate values[0]: " + values[0] + " values[1]: " + values[1]); + log.verbose("onProgressUpdate values[0]: " + values[0] + " values[1]: " + values[1]); AIMSICD.mProgressBar.setProgress(values[0]); AIMSICD.mProgressBar.setMax(values[1]); } @@ -395,7 +397,7 @@ protected void onCancelled() { private void showHideMapProgressBar(boolean pFlag) { Activity lActivity = getActivity(); if(BuildConfig.DEBUG && lActivity == null) { - Log.v(TAG, "BaseTask showHideMapProgressBar() activity is null"); + log.verbose("BaseTask showHideMapProgressBar() activity is null"); } if (lActivity != null && lActivity instanceof MapViewerOsmDroid) { ((MapViewerOsmDroid) lActivity).setRefreshActionButtonState(pFlag); diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java index 077d1cc8a..d12ad8c13 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java @@ -18,7 +18,9 @@ package com.SecUpwN.AIMSICD.utils; import android.content.Context; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import java.io.File; import java.lang.reflect.Method; @@ -43,7 +45,7 @@ */ public class SystemPropertiesReflection { - private static final String TAG = "SystemPropertiesRef"; + private static final Logger log = AndroidLogger.forClass(SystemPropertiesReflection.class); /** * This class cannot be instantiated @@ -80,10 +82,10 @@ public static String get(Context context, String key) throws IllegalArgumentExce ret = (String) get.invoke(SystemProperties, params); } catch (IllegalArgumentException iae) { - Log.e(TAG, iae.getMessage(), iae); + log.error(iae.getMessage(), iae); throw iae; } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); ret = ""; } @@ -122,10 +124,10 @@ public static String get(Context context, String key, String def) ret = (String) get.invoke(SystemProperties, params); } catch (IllegalArgumentException iae) { - Log.e(TAG, iae.getMessage(), iae); + log.error(iae.getMessage(), iae); throw iae; } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); + log.error(e.getMessage(), e); ret = def; } @@ -165,10 +167,10 @@ public static void set(Context context, String key, String val) set.invoke(SystemProperties, params); } catch (IllegalArgumentException iae) { - Log.e(TAG, iae.getMessage(), iae); + log.error(iae.getMessage(), iae); throw iae; } catch (Exception ignored) { - Log.d(TAG, ignored.getMessage(), ignored); + log.debug(ignored.getMessage(), ignored); } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java index 9140ad6b0..d83577172 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java @@ -1,7 +1,9 @@ package com.SecUpwN.AIMSICD.utils; import android.location.Location; -import android.util.Log; + +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; import java.text.NumberFormat; import java.text.ParseException; @@ -11,7 +13,7 @@ */ public class TruncatedLocation extends Location { - private static final String TAG = "TruncLocation"; + private static final Logger log = AndroidLogger.forClass(TruncatedLocation.class); public TruncatedLocation(Location l) { super(l); @@ -41,7 +43,7 @@ public static double truncateDouble(double d, int numDecimal) { Number number = format.parse(s); td = number.doubleValue(); } catch (ParseException e) { - Log.e(TAG, "parsing exception", e); + log.error("parsing exception", e); } return td; } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java index d0c3785c3..7ccf41ade 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java @@ -6,11 +6,13 @@ package com.SecUpwN.AIMSICD.utils.atcmd; import android.os.Message; -import android.util.Log; import java.io.File; import java.io.IOException; +import io.freefair.android.util.logging.AndroidLogger; +import io.freefair.android.util.logging.Logger; + /** * Description: ... * @@ -33,8 +35,7 @@ */ public abstract class AtCommandTerminal { - protected static final String TAG = "AIMSICD"; - protected static final String mTAG = "AtCommandTerminal"; //ATCoP: + protected static Logger log = AndroidLogger.forClass(AtCommandTerminal.class); // message may be null if the response is not needed public abstract void send(String s, Message message); @@ -53,7 +54,7 @@ public static AtCommandTerminal factory() throws UnsupportedOperationException { try { term = new TtyPrivFile(smdFile.getAbsolutePath()); } catch (IOException e) { - Log.e(TAG, mTAG + " IOException in constructor", e); + log.error("IOException in constructor", e); // fall through } } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java index 6932bf322..aec68284a 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java @@ -5,8 +5,6 @@ */ package com.SecUpwN.AIMSICD.utils.atcmd; -import android.util.Log; - import java.io.IOException; @@ -42,7 +40,7 @@ private TtyPrivFile(Process read, Process write) { mReadProc = read; mWriteProc = write; - Log.d(TAG, "mReadProc=" + mReadProc + ", mWriteProc=" + mWriteProc); + log.debug("mReadProc=" + mReadProc + ", mWriteProc=" + mWriteProc); } @Override @@ -54,7 +52,7 @@ public void dispose() { mOutputStream.write("ATE0\r".getBytes("ASCII"));// disable local Echo mOutputStream.flush(); } catch (IOException e) { - Log.e(TAG, "moutputstream didnt close", e); + log.error("moutputstream didnt close", e); } mReadProc.destroy(); mWriteProc.destroy(); diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java index d39f00345..80e1c8f2f 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java @@ -6,7 +6,6 @@ package com.SecUpwN.AIMSICD.utils.atcmd; import android.os.Message; -import android.util.Log; import android.util.Pair; import java.io.BufferedReader; @@ -81,7 +80,7 @@ public void run() { mOutputStream.write('\r'); mOutputStream.flush(); } catch (IOException e) { - Log.e(TAG, "Output IOException", e); + log.error("Output IOException", e); if (resultMessage != null) { resultMessage.obj = e; resultMessage.sendToTarget(); @@ -117,7 +116,7 @@ public void run() { line = in.readLine(); if (line == null) throw new IOException("reader closed"); } catch (IOException e) { - Log.e(TAG, "Input IOException", e); + log.error("Input IOException", e); if (resultMessage != null) { resultMessage.obj = e; resultMessage.sendToTarget(); @@ -130,13 +129,13 @@ public void run() { } while (!(line.equals("OK") || line.equals("ERROR") || line.startsWith("+CME ERROR"))); // XXX this logging could have sensitive info - //Log.d(TAG, "IO< " + lines); + //log.debug("IO< " + lines); if (resultMessage != null) { resultMessage.obj = lines; resultMessage.sendToTarget(); } else { - Log.d(TAG, "Data came in with no handler"); + log.debug("Data came in with no handler"); } } } catch (UnsupportedEncodingException e) { @@ -152,7 +151,7 @@ public void run() { public void send(String s, Message resultMessage) { try { // XXX this logging could have sensitive info - //Log.d(TAG, "IO> " + s); + //log.debug("IO> " + s); mWriteQ.add(Pair.create(s.getBytes("ASCII"), resultMessage)); } catch (UnsupportedEncodingException e) { // we assume that if a String is being used for convenience, it must be ASCII From e0f8f9a2acefeed5a7bed3fc589032da85e8fa70 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 12:09:33 +0100 Subject: [PATCH 55/82] fix version display in About Fragment this was the most complex way to obtain our own version that i have ever seen --- .../SecUpwN/AIMSICD/fragments/AboutFragment.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index 69cf14a89..058cb21e2 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -41,22 +41,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.about_fragment, container, false); - String version; + String version = BuildConfig.VERSION_NAME; btncredits = (Button) v.findViewById(R.id.aimsicd_credits_link); - PackageManager manager = mContext.getPackageManager(); - try { - PackageInfo info = manager != null ? manager - .getPackageInfo(mContext.getPackageName(), 0) : null; - version = (info != null ? info.versionName : ""); - } catch (PackageManager.NameNotFoundException e) { - //Woops something went wrong?? // so what do we do then? - // YES!! LOG THE EXCEPTION ~agilob - log.error("Something went wrong", e); - version = ""; - } - String BUILDOZER_BUILDNUMBER = BuildConfig.BUILDOZER_BUILDNUMBER; if (BUILDOZER_BUILDNUMBER == null) { BUILDOZER_BUILDNUMBER = "NA"; // avoid null buildnumber From dd5f12fb425ebea0fc05787d1443709fad6f934f Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 12:14:32 +0100 Subject: [PATCH 56/82] why was the context stored here? --- .../AIMSICD/activities/MapViewerOsmDroid.java | 36 +++++++++---------- .../AIMSICD/fragments/AboutFragment.java | 12 +------ 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java index 26e6bbb47..9ecc730d5 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java @@ -96,7 +96,6 @@ public final class MapViewerOsmDroid extends BaseActivity implements OnSharedPre private MapView mMap; private AIMSICDDbAdapter mDbHelper; - private Context mContext; private SharedPreferences prefs; private AimsicdService mAimsicdService; private boolean mBound; @@ -128,19 +127,18 @@ public void onCellInfoChanged(List cellInfo) { public void onCreate(Bundle savedInstanceState) { log.info("Starting MapViewer"); super.onCreate(savedInstanceState); - mContext = this; setContentView(R.layout.map); setUpMapIfNeeded(); - mDbHelper = new AIMSICDDbAdapter(mContext); + mDbHelper = new AIMSICDDbAdapter(this); tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // Bind to LocalService - Intent intent = new Intent(mContext, AimsicdService.class); - mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); + Intent intent = new Intent(this, AimsicdService.class); + bindService(intent, mConnection, Context.BIND_AUTO_CREATE); - TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); } @@ -159,8 +157,8 @@ public void onResume() { if (!mBound) { // Bind to LocalService - Intent intent = new Intent(mContext, AimsicdService.class); - mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); + Intent intent = new Intent(this, AimsicdService.class); + bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } loadPreferences(); @@ -181,11 +179,11 @@ protected void onDestroy() { prefs.unregisterOnSharedPreferenceChangeListener(this); // Unbind from the service if (mBound) { - mContext.unbindService(mConnection); + unbindService(mConnection); mBound = false; } - TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); @@ -249,7 +247,7 @@ public void onServiceDisconnected(ComponentName arg0) { // Load the default map type from preferences private void loadPreferences() { String mapTypePref = getResources().getString(R.string.pref_map_type_key); - prefs = mContext.getSharedPreferences( + prefs = getSharedPreferences( AimsicdService.SHARED_PREFERENCES_BASENAME, 0); if (prefs.contains(mapTypePref)) { int mapType = Integer.parseInt(prefs.getString(mapTypePref, "0")); @@ -302,7 +300,7 @@ private void setUpMapIfNeeded() { // Sets cluster pin color mCellTowerGridMarkerClusterer = new CellTowerGridMarkerClusterer(MapViewerOsmDroid.this); - BitmapDrawable mapPinDrawable = (BitmapDrawable) mContext.getResources().getDrawable(R.drawable.ic_map_pin_orange); + BitmapDrawable mapPinDrawable = (BitmapDrawable) getResources().getDrawable(R.drawable.ic_map_pin_orange); mCellTowerGridMarkerClusterer.setIcon(mapPinDrawable == null ? null : mapPinDrawable.getBitmap()); GpsMyLocationProvider gpsMyLocationProvider = new GpsMyLocationProvider(MapViewerOsmDroid.this.getBaseContext()); @@ -347,7 +345,7 @@ public boolean onOptionsItemSelected(MenuItem item) { if (mBound) { GeoLocation lastKnown = mAimsicdService.lastKnownLocation(); if (lastKnown != null) { - Helpers.msgLong(mContext, + Helpers.msgLong(this, getString(R.string.contacting_opencellid_for_data)); Cell cell; cell = mAimsicdService.getCell(); @@ -355,7 +353,7 @@ public boolean onOptionsItemSelected(MenuItem item) { cell.setLat(lastKnown.getLatitudeInDegrees()); setRefreshActionButtonState(true); TinyDB.getInstance().putBoolean(TinyDbKeys.FINISHED_LOAD_IN_MAP, false); - Helpers.getOpenCellData(mContext, cell, RequestTask.DBE_DOWNLOAD_REQUEST_FROM_MAP); + Helpers.getOpenCellData(this, cell, RequestTask.DBE_DOWNLOAD_REQUEST_FROM_MAP); return true; } } @@ -368,9 +366,9 @@ public boolean onOptionsItemSelected(MenuItem item) { cell.setLon(loc.getLongitude()); setRefreshActionButtonState(true); TinyDB.getInstance().putBoolean(TinyDbKeys.FINISHED_LOAD_IN_MAP, false); - Helpers.getOpenCellData(mContext, cell, RequestTask.DBE_DOWNLOAD_REQUEST_FROM_MAP); + Helpers.getOpenCellData(this, cell, RequestTask.DBE_DOWNLOAD_REQUEST_FROM_MAP); } else { - Helpers.msgLong(mContext, + Helpers.msgLong(this, getString(R.string.unable_to_determine_last_location)); } return true; @@ -437,7 +435,7 @@ protected GeoPoint doInBackground(Void... voids) { || Double.doubleToRawLongBits(dLng) != 0) { loc = new GeoPoint(dLat, dLng); - CellTowerMarker ovm = new CellTowerMarker(mContext, mMap, + CellTowerMarker ovm = new CellTowerMarker(MapViewerOsmDroid.this, mMap, "Cell ID: " + cellID, "", loc, new MarkerData( @@ -492,7 +490,7 @@ public void run() { if (isCancelled()) return null; try { loc = new GeoPoint(cell.getLat(), cell.getLon()); - CellTowerMarker ovm = new CellTowerMarker(mContext, mMap, + CellTowerMarker ovm = new CellTowerMarker(MapViewerOsmDroid.this, mMap, getString(R.string.cell_id_label) + cell.getCID(), "", loc, new MarkerData( @@ -588,7 +586,7 @@ private void loadOcidMarkersByNetwork() { //where is c.getString(6)AvgSigStr final int samples = c.getInt(c.getColumnIndex(DBTableColumnIds.DBE_IMPORT_SAMPLES)); // Add map marker for CellID - CellTowerMarker ovm = new CellTowerMarker(mContext, mMap, + CellTowerMarker ovm = new CellTowerMarker(this, mMap, "Cell ID: " + cellID, "", location, new MarkerData( diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index 058cb21e2..3382a9762 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -6,10 +6,7 @@ package com.SecUpwN.AIMSICD.fragments; import android.app.Activity; -import android.content.Context; import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.support.annotation.DrawableRes; @@ -26,14 +23,8 @@ import com.SecUpwN.AIMSICD.R; import com.SecUpwN.AIMSICD.activities.CreditsRollActivity; -import io.freefair.android.util.logging.AndroidLogger; -import io.freefair.android.util.logging.Logger; - public class AboutFragment extends Fragment { - //TODO: @Inject - private final Logger log = AndroidLogger.forClass(AboutFragment.class); - private Context mContext; private Button btncredits; @Override @@ -154,7 +145,7 @@ public void onClick(View view) { btncredits.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Intent i = new Intent(mContext, CreditsRollActivity.class); + Intent i = new Intent(getActivity(), CreditsRollActivity.class); startActivity(i); } }); @@ -164,7 +155,6 @@ public void onClick(View view) { @Override public void onAttach(Activity activity) { super.onAttach(activity); - mContext = activity.getBaseContext(); } private void showInfoDialog(Status status) { From 6cecc3346a348c31549538d75964c1af402365a1 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 21:09:52 +0100 Subject: [PATCH 57/82] remove the progressbar - it looked a bit strange - it was accessed in a very strange way --- .../com/SecUpwN/AIMSICD/test/DummyTest.java | 40 ------------------- .../java/com/SecUpwN/AIMSICD/AIMSICD.java | 28 ------------- .../AIMSICD/adapters/AIMSICDDbAdapter.java | 23 ----------- .../SecUpwN/AIMSICD/utils/RequestTask.java | 10 ----- app/src/main/res/drawable/top_shadow.xml | 24 ----------- app/src/main/res/layout/main.xml | 18 +++------ 6 files changed, 6 insertions(+), 137 deletions(-) delete mode 100644 app/src/androidTest/java/com/SecUpwN/AIMSICD/test/DummyTest.java delete mode 100644 app/src/main/res/drawable/top_shadow.xml diff --git a/app/src/androidTest/java/com/SecUpwN/AIMSICD/test/DummyTest.java b/app/src/androidTest/java/com/SecUpwN/AIMSICD/test/DummyTest.java deleted file mode 100644 index 539cbfa04..000000000 --- a/app/src/androidTest/java/com/SecUpwN/AIMSICD/test/DummyTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* Android IMSI-Catcher Detector | (c) AIMSICD Privacy Project - * ----------------------------------------------------------- - * LICENSE: http://git.io/vki47 | TERMS: http://git.io/vki4o - * ----------------------------------------------------------- - */ -package com.SecUpwN.AIMSICD.test; - -import android.test.ActivityInstrumentationTestCase2; - -import com.SecUpwN.AIMSICD.AIMSICD; - -/** - * Created by toby on 2014/12/07. - */ -public class DummyTest extends ActivityInstrumentationTestCase2 { - - public DummyTest() { - super(AIMSICD.class); - } - - /** - * Manual test to check if the progress bar is visible in the main activity - */ - public void testProgressBar() { - try { - getActivity().showProgressbar(true, 100, 0); - Thread.sleep(5000); - getActivity().showProgressbar(false, 100, 30); - Thread.sleep(1000); - getActivity().showProgressbar(false, 100, 50); - Thread.sleep(1000); - getActivity().showProgressbar(false, 100, 80); - Thread.sleep(1000); - getActivity().hideProgressbar(); - } catch (InterruptedException e) { - } - - assertTrue(true); - } -} diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java b/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java index beefa5103..178dd1740 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java @@ -93,7 +93,6 @@ public class AIMSICD extends BaseActivity implements AsyncResponse { private ActionBarDrawerToggle mDrawerToggle; private CharSequence mDrawerTitle; private CharSequence mTitle; - public static ProgressBar mProgressBar; private long mLastPress = 0; // Back press to exit timer @@ -152,8 +151,6 @@ public void onDrawerOpened(View drawerView) { mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setHomeButtonEnabled(true); - mProgressBar = (ProgressBar) findViewById(R.id.progressBar); - prefs = mContext.getSharedPreferences(AimsicdService.SHARED_PREFERENCES_BASENAME, 0); /* Pref listener to enable sms detection on pref change */ @@ -685,31 +682,6 @@ private void trackFemtocell() { mAimsicdService.setTrackingFemtocell(!mAimsicdService.isTrackingFemtocell()); } - public void showProgressbar(final boolean indeterminate, final int max, final int progress) { - runOnUiThread(new Runnable() { - @Override - public void run() { - mProgressBar.setIndeterminate(indeterminate); - if (max > 0) - mProgressBar.setMax(max); - if (max > 0 && progress >= 0) - mProgressBar.setProgress(progress); - mProgressBar.setVisibility(View.VISIBLE); - } - }); - } - - public void hideProgressbar() { - runOnUiThread(new Runnable() { - @Override - public void run() { - mProgressBar.setMax(0); - mProgressBar.setProgress(0); - mProgressBar.setVisibility(View.GONE); - } - }); - } - public void onStop() { super.onStop(); ((AppAIMSICD) getApplication()).detach(this); 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 9db95a708..1f91656e4 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java @@ -630,17 +630,10 @@ public boolean populateDBeImport() { List csvCellID = new ArrayList<>(); String next[]; - // Let's show something: Like 1/4 of a progress bar - AIMSICD.mProgressBar.setProgress(0); - AIMSICD.mProgressBar.setMax(4); - AIMSICD.mProgressBar.setProgress(1); - while ((next = csvReader.readNext()) != null) { csvCellID.add(next); } - AIMSICD.mProgressBar.setProgress(2); - if (!csvCellID.isEmpty()) { int lines = csvCellID.size(); log.info( "UpdateOpenCellID: OCID CSV size (lines): " + lines); @@ -656,8 +649,6 @@ public boolean populateDBeImport() { } lCursor.close(); - AIMSICD.mProgressBar.setProgress(3); - AIMSICD.mProgressBar.setMax(lines); int rowCounter; for (rowCounter = 1; rowCounter < lines; rowCounter++) { @@ -715,7 +706,6 @@ public boolean populateDBeImport() { 0 // TODO: rej_cause , set default 0 ); } - AIMSICD.mProgressBar.setProgress(4); log.debug( "PopulateDBeImport(): inserted " + rowCounter + " cells."); } } else { @@ -731,7 +721,6 @@ public boolean populateDBeImport() { } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } - AIMSICD.mProgressBar.setProgress(0); } } @@ -750,13 +739,8 @@ public boolean populateDBeImport() { */ public boolean restoreDB() { try { - // Progress bar should be here for each table, not each line. - AIMSICD.mProgressBar.setMax(mTables.length); - AIMSICD.mProgressBar.setProgress(0); - int tcount = 1; for (String table : mTables) { - AIMSICD.mProgressBar.setProgress(tcount++); File file = new File(mExternalFilesDirPath + "aimsicd-" + table + ".csv"); if (file.exists()) { @@ -963,8 +947,6 @@ public boolean restoreDB() { } catch (Exception e) { log.error( "RestoreDB() Error", e); return false; - } finally { - AIMSICD.mProgressBar.setProgress(0); } } @@ -997,9 +979,6 @@ public boolean restoreDB() { */ private void dumpDB() { - AIMSICD.mProgressBar.setMax(2); - AIMSICD.mProgressBar.setProgress(1); - File dumpdir = new File(mExternalFilesDirPath); //if (!dir.exists()) { dir.mkdirs(); } File file = new File(dumpdir, "aimsicd_dump.db"); @@ -1011,12 +990,10 @@ private void dumpDB() { try { log.info( "DumpDB() Attempting to dump DB to: " + file + "\nUsing: \"" + execString + "\"\n"); CMDProcessor.runSuCommand(execString); // We need SU for this... - AIMSICD.mProgressBar.setProgress(2); } catch (Exception e) { log.error( "DumpDB() Failed to export DB dump file: ", e); } log.info( "DumpDB() Dumped internal database to: " + aimdir + file); - AIMSICD.mProgressBar.setProgress(0); } diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java index a3c734713..f025efe8a 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java @@ -263,15 +263,6 @@ protected void onPreExecute() { super.onPreExecute(); } - @Override - protected void onProgressUpdate(Integer... values) { - super.onProgressUpdate(values); - // Silence or Remove when working: - log.verbose("onProgressUpdate values[0]: " + values[0] + " values[1]: " + values[1]); - AIMSICD.mProgressBar.setProgress(values[0]); - AIMSICD.mProgressBar.setMax(values[1]); - } - /** * Description: This is where we: * @@ -289,7 +280,6 @@ protected void onProgressUpdate(Integer... values) { @Override protected void onPostExecute(String result) { super.onPostExecute(result); - AIMSICD.mProgressBar.setProgress(0); TinyDB tinydb = TinyDB.getInstance(); switch (mType) { diff --git a/app/src/main/res/drawable/top_shadow.xml b/app/src/main/res/drawable/top_shadow.xml deleted file mode 100644 index 6a55ede59..000000000 --- a/app/src/main/res/drawable/top_shadow.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index 4da06a6af..927775919 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -7,20 +7,14 @@ android:layout_height="match_parent"> - + + - + android:layout_height="match_parent" /> From 8f4fb36c540aa4440e1b2cb994316e6e8c84a0ef Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Wed, 9 Dec 2015 08:06:22 +0000 Subject: [PATCH 58/82] Updated link to Debugging Guide --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 970c5c5d9..e45b4cf8d 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ AIMSICD is an app to detect [IMSI-Catchers](https://en.wikipedia.org/wiki/IMSI-c * [What it does](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector#what-it-does) * [Why use it](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector#why-use-it) * [**Contributing**](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/development/CONTRIBUTING.md) -* [Bug Tracker](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Submitting-Issues) +* [Bug Tracker](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/development/CONTRIBUTING.md#debugging) * [Warnings](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector#warnings) * [Research](https://spideroak.com/browse/share/AIMSICD/GitHub) * [Support](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector#support) @@ -85,7 +85,7 @@ Solutions for the above may be found in our [Recommendations](https://github.com ### Bug Tracker -Please follow our [Bug Submission Guide](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Submitting-Issues). +Please follow our [Bug Submission Guide](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/development/CONTRIBUTING.md#debugging). --- @@ -97,7 +97,7 @@ Although this project is fully Open Source, developing AIMSICD is a lot of work ### License -This project is completely licensed [GPL v3+](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/master/LICENSE). +This project is completely licensed [GPLv3+](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/master/LICENSE). --- From 0b9cb11d06065b2fca62454c37b13a679b15f856 Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Wed, 9 Dec 2015 09:19:44 +0000 Subject: [PATCH 59/82] Sorted detection methods --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e45b4cf8d..efa45136c 100644 --- a/README.md +++ b/README.md @@ -44,12 +44,12 @@ AIMSICD is an app to detect [IMSI-Catchers](https://en.wikipedia.org/wiki/IMSI-c AIMSICD attempts to detect IMSI-Catchers through [detection methods](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/230) such as these: * Check [tower information consistency](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/253) -* Prevent [silent app installations](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/151) * Check [LAC/Cell ID consistency](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/91) * Check [Neighbouring Cell Info](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/264) -* [Signal strength monitoring](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/97) -* Look for [silent SMS](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/69) -* [Detect FemtoCells](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/6) +* Prevent [silent app installations](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/151) +* Monitor [Signal Strength](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/97) +* Detect [silent SMS](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/69) +* Detect [FemtoCells](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/6) See our [app goals](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Development-Status#application-goals) and [development status](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Development-Status)! From 9b48a8e8eeb654bdfb95d10d523795b5eff8a861 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 22:06:47 +0100 Subject: [PATCH 60/82] remove some obsolete/redundant things from our build.gradle --- app/build.gradle | 48 ++---------------------------------------------- 1 file changed, 2 insertions(+), 46 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3891c9bcb..25111dc41 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,62 +46,18 @@ android { versionNameSuffix '-release' } } - signingConfigs { - debug { - keyAlias 'androiddebugkey' - } - } - sourceSets { - main { - assets.srcDirs = ['src/main/assets'] - } - } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } - productFlavors { - } + lintOptions { disable 'MissingTranslation' abortOnError false } -// .. set up build flavors etc here - -//====================================================================== -// Instead of "app-release.apk" this method will rewrite the name to -// "MyCoolCompany-MyNewProduct-v-RELEASE.apk" -// which is much better suited for archiving and overall handling -//---------------------------------------------------------------------- -// To restore the default behavior just delete the whole block below -// WARNING by E:V:A: This is NOT Working, generates: "AIMSICD-null.apk" -//====================================================================== -// -// applicationVariants.all { variant -> -// variant.outputs.each { output -> -// def apk = output.outputFile; -// def newName; -// -// newName = apk.name.replace(".apk", "-v" + defaultConfig.versionName + "-" + variant.buildType.name.toUpperCase() + ".apk"); -// //newName = apk.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"); -// -// newName = newName -// .replace("-" + variant.buildType.name, "") // This removes "-release" -// .replace(project.name, "AIMSICD"); // This replace app with "AIMSICD" -// -// output.outputFile = new File(apk.parentFile, newName); -// -// if (output.zipAlign) { -// output.outputFile = new File(apk.parentFile, newName.replace("-unaligned", "")); -// } -// -// logger.info('INFO: Set outputFile to ' + output.outputFile + " for [" + variant.name + "]"); -// } -// } - - packagingOptions { exclude 'META-INF/NOTICE.txt' exclude 'META-INF/LICENSE.txt' From 5f12e2580ee53617834eabb7151b89221588bd7f Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 23:06:50 +0100 Subject: [PATCH 61/82] improve lint --- app/build.gradle | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 25111dc41..206cf73d9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,6 +7,8 @@ try { logger.warn("git not available") } +def isCi = "true".equals(System.getenv("CI")) + android { compileSdkVersion 22 buildToolsVersion '22.0.1' @@ -52,10 +54,15 @@ android { targetCompatibility JavaVersion.VERSION_1_7 } - lintOptions { - disable 'MissingTranslation' + warning 'MissingTranslation', 'InvalidPackage' abortOnError false + + xmlReport false + htmlReport !isCi + + textReport isCi + textOutput 'stdout' } packagingOptions { From f95327f1e64b4f44c713f969481f1466e0da3b2d Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Wed, 9 Dec 2015 09:28:20 +0100 Subject: [PATCH 62/82] fix buildnumbers --- app/build.gradle | 17 +++++++++++------ .../AIMSICD/fragments/AboutFragment.java | 9 +++------ app/src/main/res/layout/about_fragment.xml | 2 +- .../main/res/values/untranslatable_strings.xml | 2 +- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 206cf73d9..ddb980fc8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,6 +8,15 @@ try { } def isCi = "true".equals(System.getenv("CI")) +def isTravis = "true".equals(System.getenv("TRAVIS")) + +def buildNumber = null +if(isTravis) { + buildNumber = System.getenv("TRAVIS_BUILD_NUMBER") +} else { + buildNumber = System.getenv("BUILDOZER_BUILDNUMBER") +} + android { compileSdkVersion 22 @@ -19,6 +28,8 @@ android { versionCode 36 versionName '0.1.36-alpha' testApplicationId "com.SecUpwN.AIMSICD.test" + + buildConfigField 'String', 'BUILD_NUMBER', (buildNumber == null ? 'null' : "\"${buildNumber}\"") } buildTypes { @@ -28,11 +39,6 @@ android { } catch (MissingPropertyException e) { buildConfigField 'String', 'OPEN_CELLID_API_KEY', '"NA"' } - try { - buildConfigField 'String', 'BUILDOZER_BUILDNUMBER', '\"' + System.getenv("BUILDOZER_BUILDNUMBER") + '\"' - } catch (MissingPropertyException e) { - buildConfigField 'String', 'BUILDOZER_BUILDNUMBER', '"NA"' - } if (!gitSha.equals('na')) { versionNameSuffix '-' + gitSha } else { @@ -41,7 +47,6 @@ android { } release { buildConfigField 'String', 'OPEN_CELLID_API_KEY', '"NA"' - buildConfigField 'String', 'BUILDOZER_BUILDNUMBER', '"NA"' minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java index 3382a9762..80773add0 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java @@ -36,10 +36,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, btncredits = (Button) v.findViewById(R.id.aimsicd_credits_link); - String BUILDOZER_BUILDNUMBER = BuildConfig.BUILDOZER_BUILDNUMBER; - if (BUILDOZER_BUILDNUMBER == null) { - BUILDOZER_BUILDNUMBER = "NA"; // avoid null buildnumber - } + String buildNumber = BuildConfig.BUILD_NUMBER; TextView versionNumber; TextView BuildozerView; @@ -47,9 +44,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, versionNumber = (TextView) v.findViewById(R.id.aimsicd_version); versionNumber.setText(getString(R.string.app_version) + version); - if (!"NA".equals(BUILDOZER_BUILDNUMBER)) { + if (buildNumber != null) { BuildozerView = (TextView) v.findViewById(R.id.buildozer_buildnumber); - BuildozerView.setText(getString(R.string.buildozer_buildnumber) + BUILDOZER_BUILDNUMBER); + BuildozerView.setText(getString(R.string.buildnumber) + buildNumber); BuildozerView.setVisibility(View.VISIBLE); } diff --git a/app/src/main/res/layout/about_fragment.xml b/app/src/main/res/layout/about_fragment.xml index 7f9c432ff..92ef7e9a1 100644 --- a/app/src/main/res/layout/about_fragment.xml +++ b/app/src/main/res/layout/about_fragment.xml @@ -37,7 +37,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:text="@string/buildozer_buildnumber" + android:text="@string/buildnumber" android:textColor="@color/red_text" android:textSize="16sp" android:visibility="gone"/> diff --git a/app/src/main/res/values/untranslatable_strings.xml b/app/src/main/res/values/untranslatable_strings.xml index 6738e2d35..d67c73e67 100644 --- a/app/src/main/res/values/untranslatable_strings.xml +++ b/app/src/main/res/values/untranslatable_strings.xml @@ -8,7 +8,7 @@ Android IMSI-Catcher Detector (AIMSICD) - Buildozer Build:  + Build Number: https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/HEAD/CONTRIBUTING.md https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/blob/HEAD/DISCLAIMER From fdcc90d98d78c7f2bb2efcccb03f5e20a5000c3b Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Tue, 8 Dec 2015 00:04:50 +0100 Subject: [PATCH 63/82] Update proguard-rules.txt Just try some cleanup --- app/proguard-rules.txt | 63 +----------------------------------------- 1 file changed, 1 insertion(+), 62 deletions(-) diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt index c6722ef71..83e091fe4 100644 --- a/app/proguard-rules.txt +++ b/app/proguard-rules.txt @@ -1,77 +1,16 @@ +-verbose -optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --dontskipnonpubliclibraryclassmembers -dontpreverify --verbose -dump class_files.txt -printseeds seeds.txt -printusage unused.txt -printmapping mapping.txt --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* --allowaccessmodification -keepattributes *Annotation* --renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable --repackageclasses '' - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference --keep public class com.android.vending.licensing.ILicensingService --dontnote com.android.vending.licensing.ILicensingService -dontwarn java.beans.** -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. --keepclassmembers class * implements java.io.Serializable { -static final long serialVersionUID; -private static final java.io.ObjectStreamField[] serialPersistentFields; -private void writeObject(java.io.ObjectOutputStream); -private void readObject(java.io.ObjectInputStream); -java.lang.Object writeReplace(); -java.lang.Object readResolve(); -} - -# Preserve all native method names and the names of their classes. --keepclasseswithmembernames class * { -native ; -} - --keepclasseswithmembernames class * { -public (android.content.Context, android.util.AttributeSet); -} - --keepclasseswithmembernames class * { -public (android.content.Context, android.util.AttributeSet, int); -} - -# Preserve static fields of inner classes of R classes that might be accessed -# through introspection. --keepclassmembers class **.R$* { -public static ; -} - -# Preserve the special static methods that are required in all enumeration classes. --keepclassmembers enum * { -public static **[] values(); -public static ** valueOf(java.lang.String); -} - --keep public class * { -public protected *; -} - --keep class * implements android.os.Parcelable { -public static final android.os.Parcelable$Creator *; -} - -dontwarn org.apache.** -dontwarn okio.** From 697b0ca35ba9f9852ba9ece5bde133d43179a9a5 Mon Sep 17 00:00:00 2001 From: SecUpwN Date: Wed, 9 Dec 2015 21:46:08 +0100 Subject: [PATCH 64/82] Resized documentation button to fit screen --- app/src/main/res/values-cs/translatable_strings.xml | 2 +- app/src/main/res/values-de/translatable_strings.xml | 2 +- app/src/main/res/values-es/translatable_strings.xml | 2 +- app/src/main/res/values-fr/translatable_strings.xml | 2 +- app/src/main/res/values-ja/translatable_strings.xml | 2 +- app/src/main/res/values-nl/translatable_strings.xml | 2 +- app/src/main/res/values-pl/translatable_strings.xml | 2 +- app/src/main/res/values-ru/translatable_strings.xml | 2 +- app/src/main/res/values-sq/translatable_strings.xml | 2 +- app/src/main/res/values-uk/translatable_strings.xml | 2 +- app/src/main/res/values/translatable_strings.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-cs/translatable_strings.xml b/app/src/main/res/values-cs/translatable_strings.xml index 4a8e0578c..5f0d2cd47 100644 --- a/app/src/main/res/values-cs/translatable_strings.xml +++ b/app/src/main/res/values-cs/translatable_strings.xml @@ -62,7 +62,7 @@ O aplikaci AIMSICD Android projekt umožňující detekovat a bránit se útokům IMSI Catcher (falešné BTS) v GSM/UMTS sítích. AIMSICD na GitHub - Dokumentace (WIKI) + DOKUMENTACE PODÍLET SE UPOZORNĚNÍ VYDÁNÍ diff --git a/app/src/main/res/values-de/translatable_strings.xml b/app/src/main/res/values-de/translatable_strings.xml index cf704f53e..c41565604 100644 --- a/app/src/main/res/values-de/translatable_strings.xml +++ b/app/src/main/res/values-de/translatable_strings.xml @@ -80,7 +80,7 @@ Version:  Android-basiertes Projekt zur Erkennung und Vermeidung gefälschter Mobilfunkstationen\n(IMSI-Catcher) in GSM/UMTS-Netzwerken. AIMSICD auf GitHub - Dokumentation (WIKI) + DOKUMENTATION MITMACHEN HAFTUNG VERÖFFENTLICHUNG diff --git a/app/src/main/res/values-es/translatable_strings.xml b/app/src/main/res/values-es/translatable_strings.xml index eaaeca4a5..5b5d61968 100644 --- a/app/src/main/res/values-es/translatable_strings.xml +++ b/app/src/main/res/values-es/translatable_strings.xml @@ -62,7 +62,7 @@ versión:  Projecto basado en Android para detectar y evadir estaciones celulares falsas (IMSI-Catchers) en Redes GSM/UMTS. AIMSICD en GitHub - Documentación (WIKI) + DOCUMENTACIÓN CONTRIBUIR DESCARGO DE RESPONSABILIDAD VERSIONES diff --git a/app/src/main/res/values-fr/translatable_strings.xml b/app/src/main/res/values-fr/translatable_strings.xml index 3027c1941..172fe0c70 100755 --- a/app/src/main/res/values-fr/translatable_strings.xml +++ b/app/src/main/res/values-fr/translatable_strings.xml @@ -79,7 +79,7 @@ Version:  Projet Basé sur Android conçu pour détecter et éviter les fausses stations de bases (IMSI-Catchers) sur les réseaux GSM/UMTS. AIMSICD sur GitHub - Documentation (WIKI) + DOCUMENTATION CONTRIBUTEURS INFOS LÉGALES RELEASES diff --git a/app/src/main/res/values-ja/translatable_strings.xml b/app/src/main/res/values-ja/translatable_strings.xml index 346b2fb67..05a1d131f 100644 --- a/app/src/main/res/values-ja/translatable_strings.xml +++ b/app/src/main/res/values-ja/translatable_strings.xml @@ -63,7 +63,7 @@ バージョン:  GSM/UMTS ネットワークで、偽の基地局 (IMSI キャッチャー) を検出して避けるための Android ベースのプロジェクト。 GitHub 上の AIMSICD - ドキュメント (WIKI) + ドキュメント 貢献 免責事項 リリース diff --git a/app/src/main/res/values-nl/translatable_strings.xml b/app/src/main/res/values-nl/translatable_strings.xml index c9b3a30a2..034e830f8 100644 --- a/app/src/main/res/values-nl/translatable_strings.xml +++ b/app/src/main/res/values-nl/translatable_strings.xml @@ -60,7 +60,7 @@ Versie:  Android project om valse basisstations (IMSI-catchers) te vinden in GSM/UMTS netwerken. AIMSICD op GitHub - Documentatie (Wiki) + DOCUMENTATIE BIJDRAGEN VOORBEHOUD VERSIES diff --git a/app/src/main/res/values-pl/translatable_strings.xml b/app/src/main/res/values-pl/translatable_strings.xml index 19ac16640..057665647 100644 --- a/app/src/main/res/values-pl/translatable_strings.xml +++ b/app/src/main/res/values-pl/translatable_strings.xml @@ -72,7 +72,7 @@ Wersja:  Projekt na Android pozwalający wykrywać fałszywe stacje bazowe (IMSI-catchery) w sieci GSM/UMTS. AIMSICD na Githubie - Dokumentacja (WIKI) + DOKUMENTACJA PRZYCZYNIAJĄ ZASTRZEŻENIE WYDANIA diff --git a/app/src/main/res/values-ru/translatable_strings.xml b/app/src/main/res/values-ru/translatable_strings.xml index e74bc40e2..4aeb230ca 100644 --- a/app/src/main/res/values-ru/translatable_strings.xml +++ b/app/src/main/res/values-ru/translatable_strings.xml @@ -89,7 +89,7 @@ Версия:  Проект для обнаружения и избегания поддельных базовых станций (IMSI-перехватчики) в GSM / UMTS сети на основе Android. AIMSICD на GitHub - Документация (WIKI) + ДОКУМЕНТАЦИЯ ВКЛАД ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ РЕЛИЗЫ diff --git a/app/src/main/res/values-sq/translatable_strings.xml b/app/src/main/res/values-sq/translatable_strings.xml index 8a5e92a9a..f60864b67 100644 --- a/app/src/main/res/values-sq/translatable_strings.xml +++ b/app/src/main/res/values-sq/translatable_strings.xml @@ -62,7 +62,7 @@ Versioni:  Projekt i bazuar në sistemin android për të identifukuar dhe mënjanuar kulla të gabuara/ të rrema (IMSI-Catchers) në rrjetet GSM/UMTS. AIMSICD në GitHub - Dokumentacioni (WIKI) + DOKUMENTACIONI KONTRIBO Heq dorë VERSIONET diff --git a/app/src/main/res/values-uk/translatable_strings.xml b/app/src/main/res/values-uk/translatable_strings.xml index abedf5a27..de59f7e33 100644 --- a/app/src/main/res/values-uk/translatable_strings.xml +++ b/app/src/main/res/values-uk/translatable_strings.xml @@ -48,7 +48,7 @@ Про AIMSICD Версія:  AIMSICD на GitHub - Документація (WIKI) + ДОКУМЕНТАЦІЯ Очікування/Завантаження. Все гаразд. ID мережі: diff --git a/app/src/main/res/values/translatable_strings.xml b/app/src/main/res/values/translatable_strings.xml index 70b3f3676..7a948c943 100644 --- a/app/src/main/res/values/translatable_strings.xml +++ b/app/src/main/res/values/translatable_strings.xml @@ -78,7 +78,7 @@ Version:  Android-based project to detect and avoid fake base stations (IMSI-Catchers) in GSM/UMTS Networks. AIMSICD on GitHub - Documentation (WIKI) + DOCUMENTATION CONTRIBUTE DISCLAIMER RELEASES From f8a1f6edca4a20c5b285d232639c9a34586cc319 Mon Sep 17 00:00:00 2001 From: SecUpwN Date: Wed, 9 Dec 2015 22:28:14 +0100 Subject: [PATCH 65/82] Fixed #546 for OpenCellID string consistency --- .../res/values-cs/translatable_strings.xml | 2 +- .../res/values-de/translatable_strings.xml | 20 ++++++++--------- .../res/values-es/translatable_strings.xml | 22 +++++++++---------- .../res/values-fr/translatable_strings.xml | 2 +- .../res/values-ja/translatable_strings.xml | 18 +++++++-------- .../res/values-nl/translatable_strings.xml | 22 +++++++++---------- .../res/values-pl/translatable_strings.xml | 16 +++++++------- .../res/values-ru/translatable_strings.xml | 22 +++++++++---------- .../res/values-sq/translatable_strings.xml | 8 +++---- .../res/values-uk/translatable_strings.xml | 6 ++--- .../main/res/values/translatable_strings.xml | 18 +++++++-------- 11 files changed, 78 insertions(+), 78 deletions(-) diff --git a/app/src/main/res/values-cs/translatable_strings.xml b/app/src/main/res/values-cs/translatable_strings.xml index 5f0d2cd47..b14a782eb 100644 --- a/app/src/main/res/values-cs/translatable_strings.xml +++ b/app/src/main/res/values-cs/translatable_strings.xml @@ -106,7 +106,7 @@ Vložte API Klíč OpenCellID zde Sledování Sítě Povolit automatické sledování sítě - Vyžádat si nový OCID API Klíč + Vyžádat si nový OpenCellID API Klíč Vyžádat API Klíč pro přístup k OpenCellID databázi Nastavení Mapového Zobrazení diff --git a/app/src/main/res/values-de/translatable_strings.xml b/app/src/main/res/values-de/translatable_strings.xml index c41565604..e0fedda0a 100644 --- a/app/src/main/res/values-de/translatable_strings.xml +++ b/app/src/main/res/values-de/translatable_strings.xml @@ -127,7 +127,7 @@ OpenCellID API-Schlüssel hier eingeben Funkzellenüberprüfung Automatische Funkzellenüberprüfung - OCID API-Schlüssel anfordern + OpenCellID API-Schlüssel anfordern API-Schlüssel für OpenCellID-Zugang anfordern @@ -177,7 +177,7 @@ OpenCellID API-Schlüssel - Drücke OK um einen API-Schlüssel von OpenCellID.org anzufordern. Dies ermöglicht das Herunterladen deren Daten und das Anzeigen in der Funkantennenkarte. Zudem können gesammelte Funkturmdaten an OCID übermittelt werden. Wenn keine Daten im Zeitraum von 20 Tagen hochgeladen wurden, wird der API-Schlüssel ungültig. + Drücke OK um einen API-Schlüssel von OpenCellID.org anzufordern. Dies ermöglicht das Herunterladen deren Daten und das Anzeigen in der Funkantennenkarte. Zudem können gesammelte Funkturmdaten an OpenCellID übermittelt werden. Wenn keine Daten im Zeitraum von 20 Tagen hochgeladen wurden, wird der API-Schlüssel ungültig. Fehler bei Schlüsselanforderung: Neuer API-Schlüssel gesichert. @@ -229,7 +229,7 @@ Funkzelldaten werden aufzeichnet. Aufzeichnung der Funkzelldaten angehalten. Anfrage für neuen API-Schlüssel nur einmal aller 24 Stunden möglich!\nBitte später erneut versuchen. - Zell-ID nicht existent in OCID-Datenbank! + Zell-ID nicht in OpenCellID-Datenbank! Feindliche Betriebsaktion: LAC-Änderung erkannt! Femtozellenerkennung aktiv. Funkzellen werden aufgezeichnet. @@ -255,8 +255,8 @@ OpenCellID-Daten erfolgreich empfangen. Fehler beim empfangen der OpenCellID-Daten.\nNetzwerk überprüfen! OpenCellID-Daten erfolgreich empfangen.\nAntennen aktualisiert. - BTS-Daten erfolgreich zu OCID hochgeladen. - Fehler beim hochladen zum OCID-Server! + BTS-Daten erfolgreich zu OpenCellID hochgeladen. + Fehler beim hochladen zum OpenCellID-Server! Wiederherstelung der Datenbank erfolgreich. Fehler beim Wiederherstellen der Datenbank. Datenbank wurde erfolgreich gesichert nach: @@ -307,14 +307,14 @@ AIMSICD-Gefahrenstatus, Benachbarte Funkzellen und Verschlüsselungsindikator. SIM-Details, Netzbetreiber, IMEI und TMSI. - Zeigt detaillierten Vergleich der verbundenen Funkzelle mit den Daten von OCID (wenn vorhanden) und hebt Unterschiede hervor. + Zeigt detaillierten Vergleich der verbundenen Funkzelle mit den Daten von OpenCellID (wenn vorhanden) und hebt Unterschiede hervor. Zeigt unsere verschiedenen Datenbanken. Karte farbcodierter Antennen der Umgebung. Maske zur Eingabe von AT-Befehlen zur Kommunikation mit dem Baseband Processor (benötigt ROOT). Umschaltung der Angriffserkennung und Sammlung der Daten in die internen Datenbanken. - Starten um Funkzellen aufzuzeichnen, in der Funkantennenkarte anzuzeigen und evtl. später zu OCID hochzuladen. + Starten um Funkzellen aufzuzeichnen, in der Funkantennenkarte anzuzeigen und evtl. später zu OpenCellID hochzuladen. AIMSICD-Einstellungen wie Schutzregeln, Aktualisierungszeiten und Dienstverhalten. @@ -327,15 +327,15 @@ API-Schlüssel für die Nutzung der OpenCellID-Datenbanken sowie hoch- und herunterladen der Daten anfordern… Status-Symbole und Erklärung des Projekts. - OCID-Datenbank herunterladen. - Eigene BTS-Daten zu OCID hochladen. + OpenCellID-Datenbank herunterladen. + Eigene BTS-Daten zu OpenCellID hochladen. Fehlerprotokolle sammeln und versenden. Diese App verlassen. Standort wird ermittelt… Alte Datenbank kann auf Grund struktureller Änderungen nicht wiederhergestellt werden! Eindeutige BTS-Daten BTS-Messungen - Importierte OCID-Daten + Importierte OpenCellID-Daten Voreingestellte MCC-Standorte Stille SMS Ereignisprotokoll diff --git a/app/src/main/res/values-es/translatable_strings.xml b/app/src/main/res/values-es/translatable_strings.xml index 5b5d61968..d97cd5e28 100644 --- a/app/src/main/res/values-es/translatable_strings.xml +++ b/app/src/main/res/values-es/translatable_strings.xml @@ -106,7 +106,7 @@ Introduzca su llave de API OpenCellID aquí Monitoreo de Celda Habilitar el Rastreo automático de la Celda - Solicitar llave de OCID API + Solicitar llave de OpenCellID API Solicitar llave de API para acceso a datos OpenCellID Preferencias del visor de mapa @@ -190,7 +190,7 @@ Rastreando Informacion de Celda. Se detuvo el rastraeo de informacion de celda. Sólo una nueva solicitud de llave API cada 24 horas!\nPor favor Inténtalo más tarde. - Cell ID no existe en la Base de Datos OCID! + Cell ID no existe en la Base de Datos OpenCellID! Área de servicio hostil: Cambio de LAC Detectado! Detección de FemtoCell activa. Rastreo de Celda Activo. @@ -218,8 +218,8 @@ Datos de OpenCellID recibidos con éxito. Error al recuperar datosde OpenCellID.\nRevisa tu red! Datos de OpenCellID recibidos con éxito.\nMarcadores actualizados. - Datos de BTS cargados a OCID Exitosamente. - Error al cargar datos BTS a los servidores de OCID! + Datos de BTS cargados a OpenCellID Exitosamente. + Error al cargar datos BTS a los servidores de OpenCellID! Restauración exitosa. Restauracion de base de datos Exitosa. Error restaurando base de datos. @@ -269,13 +269,13 @@ Estado de amenaza AIMSICD, Celdas Vecinas, indicador de método de cifrado. Detalles del proveedor SIM, IMEI, TMSI. - Ver comparación detallada de la célula conectada actualmente, con los datos (si existe) en OCID y resaltar las diferencias. + Ver comparación detallada de la célula conectada actualmente, con los datos (si existe) en OpenCellID y resaltar las diferencias. Ver las diferentes tablas de la DB que tenemos. Mapa de color codificado de las antenas cercanas. Interfaz que permite enviar comandos AT al procesador de banda base (requiere ROOT). Iniciar/detener detección de ataque y recoger datos de celdas en las tablas de base de datos internas. - Empezar a Rastrear las celdas para mostrarlas en el visor de antena y posiblemente más adelante subir a la OCID. + Empezar a Rastrear las celdas para mostrarlas en el visor de antena y posiblemente más adelante subir a la OpenCellID. Configuración de AIMSICD como las normas de protección, tiempos de consulta y comportamiento de servicio. Backup Base de datos SQLite3 a tarjeta SD. @@ -286,15 +286,15 @@ Obtener una llave API para usar la base de datos OpenCellID para cargar y descargar datos… Iconos de estado y explicacion del proyecto. - Descargas de la base de datos OCID. - Carga tus BTS a la base de datos de OCID. + Descargas de la base de datos OpenCellID. + Carga tus BTS a la base de datos de OpenCellID. Recopilar y enviar registros de errores. Salir de esta aplicación. Esperando ubicación… No se pueden restaurar copias de seguridad de la versión anterior de la base de datos debido a cambios estructurales! Datos únicos BTS Mediciones de BTS - Datos importados OCID + Datos importados OpenCellID Ubicaciones predeterminadas de MCC SMS silencioso Registro de eventos @@ -311,8 +311,8 @@ Base de datos borrada y recreada con éxito.\nReinicie la aplicación para borrar valores de la memoria. - Llave OpenCellId Invalida, Intente de nuevo mas tarde. - Obtener llave API de OpenCellId... + Llave OpenCellID Invalida, Intente de nuevo mas tarde. + Obtener llave API de OpenCellID… Ajustes de Notificación Habilitar Vibración diff --git a/app/src/main/res/values-fr/translatable_strings.xml b/app/src/main/res/values-fr/translatable_strings.xml index 172fe0c70..2d09b7581 100755 --- a/app/src/main/res/values-fr/translatable_strings.xml +++ b/app/src/main/res/values-fr/translatable_strings.xml @@ -388,7 +388,7 @@ Erreur inconnue lors de l\'initialisation de l\'injecteur de commandes AT.\nMerci de chercher les erreurs dans le logcat et de les poster sur Github. Clé OpenCellId invalide, merci de réessayer plus tard. - Demande d\'une clé OpenCellId... + Demande d\'une clé OpenCellID… Restauration réussie. Base de données supprimée et recréée avec succès.\nVeuillez redémarrer l\'application pour nettoyer les anciennes données de la mémoire. diff --git a/app/src/main/res/values-ja/translatable_strings.xml b/app/src/main/res/values-ja/translatable_strings.xml index 05a1d131f..e7fdaa4f8 100644 --- a/app/src/main/res/values-ja/translatable_strings.xml +++ b/app/src/main/res/values-ja/translatable_strings.xml @@ -108,7 +108,7 @@ ここに OpenCellID API キーを入力してください 基地局の監視 基地局の自動監視を有効にします - OCID API キーを要求 + OpenCellID API キーを要求 OpenCellID データ アクセス用の API キーを要求します 地図ビューアーのプリファレンス @@ -190,7 +190,7 @@ 基地局情報を追跡します。 基地局情報の追跡を停止します。 新しい API キー要求は 24 時間に 1 回だけです!\n後でもう一度試してください。 - セル ID が OCID データベースに存在しません! + セル ID が OpenCellID データベースに存在しません! 安全でないサービス エリア: この付近に少なくとも 1 つの新しいまたは未知の BTS が運用中です。あるいは A5/3 よりも低い、安全でない (壊れた) 暗号化アルゴリズムを使用しています [検出は WIP]。このエリアの通話/SMS は傍受や記録される可能性があります。あなたは今すぐこの場所を離れたほうがよいです。 敵対的なサービスの活動を検出しました: IMSI キャッチャー (IMSIC) または偽の BTS (FBTS) が積極的にユーザーを追跡します。このエリアでアクティブなスキャンが行われます。特に政情不安がある場合は、この場所を避ける必要があります。お使いのバッテリーを取りはずすか、携帯電話を破壊します! 敵対的な追跡を検出しました: FBTS または IMSIC が積極的にあなたを追跡し、お使いの携帯電話が通常の暗号化された携帯電話会社を介した接続を防止します。あなたが危険や影響を受けている場合は、お使いの電話 + SIM を破壊し、最近盗まれたものとして報告してください。 @@ -222,8 +222,8 @@ OpenCellID データを正常に受信しました。 OpenCellID データの取得エラー。\nネットワークを確認してください! OpenCellID データを正常に受信しました。\n地図マーカーを更新します。 - OCID に BTS データを正常にアップロードしました。 - OCID サーバーに BTS データをアップロード中にエラー! + OpenCellID に BTS データを正常にアップロードしました。 + OpenCellID サーバーに BTS データをアップロード中にエラー! 正常に復元しました。 正常にデータベースの復元を完了しました。 データベースの復元中にエラー。 @@ -273,11 +273,11 @@ AIMSICD 脅威ステータス、隣接する基地局、暗号化方法インジケーター。 SIM ネットワーク プロバイダーの詳細、IMEI、TMSI。 - OCID で見つかったデータ (ある場合) と、現在接続している基地局の詳細な比較を表示し、違いを強調します。 + OpenCellID で見つかったデータ (ある場合) と、現在接続している基地局の詳細な比較を表示し、違いを強調します。 私たちが持っている別の DB テーブルを表示します。 近くの、色でコード化されたアンテナの地図。 攻撃検出を開始/停止し、内部データベース テーブルに基地局の詳細を収集します。 - アンテナ地図ビューアーに基地局の追跡の表示を開始します。後で OCID にアップロードすることができます。 + アンテナ地図ビューアーに基地局の追跡の表示を開始します。後で OpenCellID にアップロードすることができます。 保護ルール、ポーリング時間、そしてサービスの動作などの AIMSICD 設定 。 SD カードに SQLite3 DB をバックアップします。 @@ -288,15 +288,15 @@ OpenCellID データベースを使用してデータをアップロードおよびダウンロードするために API キーを取得… ステータス アイコンとプロジェクトの説明。 - OCID データベースをダウンロードします。 - あなたの BTS を OCID データベースにアップロードします。 + OpenCellID データベースをダウンロードします。 + あなたの BTS を OpenCellID データベースにアップロードします。 エラー ログを収集して送信します。 このアプリを終了します。 位置情報の待機中… 構造が変更されたため、以前のデータベース バージョンからバックアップを復元することができません! 固有の BTS データ BTS 測定結果 - インポートした OCID データ + インポートした OpenCellID データ デフォルトの MCC の場所 サイレント SMS イベント ログ diff --git a/app/src/main/res/values-nl/translatable_strings.xml b/app/src/main/res/values-nl/translatable_strings.xml index 034e830f8..cf5a3ab18 100644 --- a/app/src/main/res/values-nl/translatable_strings.xml +++ b/app/src/main/res/values-nl/translatable_strings.xml @@ -106,7 +106,7 @@ Geef hier uw OpenCellID sleutel in Celmonitoring Zet automatische celmonitoring aan - Verzoek OCID API sleutel + Verzoek OpenCellID API sleutel Verzoek API sleutel voor OpenCellID data toegang Kaartscherm instellingen @@ -190,7 +190,7 @@ Volgen celinformatie. Gestopt met volgen celinformatie. Slechts een nieuwe API key per 24 uur!\nProbeer het later nog eens. - Cell ID bestaat niet in OCID database! + Cell ID bestaat niet in OpenCellID database! Vijandig gebied: veranderende LAC waargenomen! FemtoCell detectie actief. Telefoon type @@ -223,8 +223,8 @@ OpenCellID gegevens succesvol ververst. Fout bij het ophalen van OpenCellID gegevens.\nControleer uw netwerk! OpenCellID gegevens succesvol ontvangen.\nKaartmarkeringen vernieuwd. - BTS gegevens succesvol verstuurd naar OCID. - Fout bij het opsturen van BTS gegevens naar OCID servers! + BTS gegevens succesvol verstuurd naar OpenCellID. + Fout bij het opsturen van BTS gegevens naar OpenCellID servers! Geen OpenCellID API sleutel gevonden!\nStel uw sleutel eerst in de instellingen in. Scherm verversen Kan geen ROOT toegang op uw toestel krijgen.\nVersturen van AT commando\'s vereist ROOT terminal toegang.\nControleer of uw apparaat ROOT toegang heeft en probeer opnieuw. @@ -269,13 +269,13 @@ AIMSICD dreigingsstatus, naburige cellen, versleutelingsmethode indicator. SIM netwerk provider details, IMEI, TMSI. - "Toont een gedetailleerde vergelijking van de cel waarmee u nu verbonden bent en de gegevens uit OCID en toont de verschillen." + "Toont een gedetailleerde vergelijking van de cel waarmee u nu verbonden bent en de gegevens uit OpenCellID en toont de verschillen." Toon de verschillende DB tabellen. Kleurcode kaart van in de buurt zijnde antennes. Interface dat het mogelijk maakt AT commando\'s te sturen naar de baseband processor (Root nodig). Start/stop aanvalsdetectie en verzamel mastgegevens in de interne database tabellen. - Start het volgen van cellen om ze op de antennekaart te tonen en ze later te versturen naar OCID. + Start het volgen van cellen om ze op de antennekaart te tonen en ze later te versturen naar OpenCellID. AIMSICD instellingen zoals beschermingsregels, contactfrequentie en service gedrag. Backup SQLite3 DB naar de SD-kaart. @@ -286,15 +286,15 @@ Verkrijg een API sleutel voor de OpenCellID database om gegevens te up- en downloaden… Status iconen en uitleg over het project. - Download de OCID database. - Upload de BTS naar de OCID database. + Download de OpenCellID database. + Upload de BTS naar de OpenCellID database. Verzamel en verstuur foutberichten. Deze app afsluiten. Wachten op locatie… Kan de backup van een oud databaseformaat niet terugzetten omdat de database structuur gewijzigd is! Unieke BTS gegevens BTS metingen - OCID gegevens geïmporteerd + OpenCellID gegevens geïmporteerd Standaard MCC locaties Stille SMS Gebeurtenissenlog @@ -309,8 +309,8 @@ Onbekende of onveilige BTS Nieuwe of recent toegevoegde BTS - Ongeldige OpenCellId sleutel, probeer het later nog eens. - Verkrijgen OpenCellId API sleutel... + Ongeldige OpenCellID sleutel, probeer het later nog eens. + Verkrijgen OpenCellID API sleutel... De database is succesvol verwijderd en opnieuw aangemaakt.\nHerstart de app om oude gegevens uit het geheugen te verwijderen. diff --git a/app/src/main/res/values-pl/translatable_strings.xml b/app/src/main/res/values-pl/translatable_strings.xml index 057665647..7f262aa29 100644 --- a/app/src/main/res/values-pl/translatable_strings.xml +++ b/app/src/main/res/values-pl/translatable_strings.xml @@ -120,7 +120,7 @@ Wpisz swój klucz API do OpenCellID Monitorowanie komórek Włącz automatyczne monitorowanie komórek - Zażądaj klucz API OCID + Zażądaj klucz API OpenCellID Pobierz nowy klucz API dla danych OpenCellID @@ -221,8 +221,8 @@ Wstrzymano monitorowanie komórek. Śledzenie informacji komórek. Wstrzymano śledzenie komórek. - Możesz pobrać tylko jeden klucz OCID na dobę.\nSpróbuj później. - ID komórki nie istnieje w bazie danych OCID! + Możesz pobrać tylko jeden klucz OpenCellID na dobę.\nSpróbuj później. + ID komórki nie istnieje w bazie danych OpenCellID! Niezabezpieczona okolica: LAC został zmieniony! Wykrywanie FemtoCell aktywne. Śledzenie komórek aktywne. @@ -312,7 +312,7 @@ Rozpoczyna/zatrzymuje wykrywanie ataku i zbieranie danych do lokalnej bazy danych. - Zacznij śledzić komórki do wyświetlania na antenie Map Viewer i ewentualnie później przesłać do OCID. + Zacznij śledzić komórki do wyświetlania na antenie Map Viewer i ewentualnie później przesłać do OpenCellID. Ustawienia AIMSICD, czas odświeżania i zachowanie serwisów. @@ -325,8 +325,8 @@ Uzyskaj klucz API do OpenCellID by pobierać i wysyłać dane… O nas i kogo wspieramy. - Pobierz bazę danych OCID. - Wyślij dane o lokalnych BTS do OCID. + Pobierz bazę danych OpenCellID. + Wyślij dane o lokalnych BTS do OpenCellID. Wczytaj i wyślij logi. Zakończ działanie aplikacji. Oczekiwanie na lokalizację… @@ -348,8 +348,8 @@ Nieznany lub niebezpieczny BTS Nowy lub niedawno dodany BTS - Nieprawidłowany klucz OpenCell ID, spróbuj później. - Pobieranie klucza API OpenCellId... + Nieprawidłowany klucz OpenCellID, spróbuj później. + Pobieranie klucza API OpenCellID… @string/ui_icon_flat diff --git a/app/src/main/res/values-ru/translatable_strings.xml b/app/src/main/res/values-ru/translatable_strings.xml index 4aeb230ca..4db23064c 100644 --- a/app/src/main/res/values-ru/translatable_strings.xml +++ b/app/src/main/res/values-ru/translatable_strings.xml @@ -136,7 +136,7 @@ Введите здесь ваш ключ OpenCellID API Мониторинг сотовых сетей Включить автоматический мониторинг сотовых сетей - Запрос ключа OCID API + Запрос ключа OpenCellID API Запрос ключа API для доступа к данным OpenCellID @@ -239,7 +239,7 @@ Отслеживания данных сотового. Отслеживания данных сотового остановлена. Только один запрос нового ключа API за 24 часа!\nПожалуйста, повторите попытку позже. - ID соты не существует в базе данных OCID! + ID соты не существует в базе данных OpenCellID! Враждебная зона обслуживания: Изменение LAC обнаружено! Обнаружение фемтосот активно. Отслеживание активной сотовой ячейки. @@ -265,8 +265,8 @@ Данные OpenCellID успешно приняты. Ошибка при получении данных OpenCellID.\nПроверьте вашу сеть! Данные OpenCellID успешно приняты.\nМаркеры карты обновлены. - Данные BTS для OCID выгружены успешно. - Ошибка при выгрузке данных BTS для OCID серверов! + Данные BTS для OpenCellID выгружены успешно. + Ошибка при выгрузке данных BTS для OpenCellID серверов! Восстановление базы данных успешно завершено. Ошибка восстановления базы данных. Резервная копия базы данных успешна сохранена в: @@ -291,14 +291,14 @@ AIMSICD status, neighboring cells, ciphering method indicator. SIM network provider details, IMEI, TMSI. - Show detailed comparison of the currently connected cell, with the data (if any) found in OCID and highlight the differences. + Show detailed comparison of the currently connected cell, with the data (if any) found in OpenCellID and highlight the differences. View the different DB tables we have. Map of color coded antennas nearby. Interface that allows sending AT commands to Baseband Processor (requires ROOT). Старт / Стоп обнаружения атаки и собирать информацию клеточных во внутренние таблицы базы данных. - Начните отслеживать клеток для отображения на антенны Map Viewer и, возможно, позже загрузить на OCID. + Начните отслеживать клеток для отображения на антенны Map Viewer и, возможно, позже загрузить на OpenCellID. AIMSICD settings and preferences such as polling times, protections and service behaviour. @@ -311,15 +311,15 @@ Get an API key for using the OpenCellID database to upload and download data… Status Icons and Project explained. - Downloads the OCID Database. - Uploads your BTS to the OCID Database. + Downloads the OpenCellID Database. + Uploads your BTS to the OpenCellID Database. Collect and send error logs. Exit this app. Waiting for location… Unable to restore backup from previous database version due to structural changes! Unique BTS Data BTS Measurements - Imported OCID Data + Imported OpenCellID Data Default MCC Locations Silent SMS EventLog @@ -393,8 +393,8 @@ Удаление и повторное создание базы данных завершено успешно.\nПожалуйста, перезапустите приложения для сброса значений из памяти. - Неверный ключ OpenCellId, попробуйте еще позже. - Получение OpenCellId ключа… + Неверный ключ OpenCellID, попробуйте еще позже. + Получение OpenCellID ключа… Удалено Не получилось удалить diff --git a/app/src/main/res/values-sq/translatable_strings.xml b/app/src/main/res/values-sq/translatable_strings.xml index f60864b67..4fa0d9e66 100644 --- a/app/src/main/res/values-sq/translatable_strings.xml +++ b/app/src/main/res/values-sq/translatable_strings.xml @@ -101,12 +101,12 @@ Zgjedh paraqitjen e ikonës Rifresko quotat Kontrollo aktualizimin e frequencës së aparatit\nZgjedhja e deritanishme: %s - Ndryshimet e OpenCELLID - Çelësi API-it i OpenCELLID - Shtypni këtu çelësin e API-it tuaj OpenCELLID + Ndryshimet e OpenCellID + Çelësi API-it i OpenCellID + Shtypni këtu çelësin e API-it tuaj OpenCellID Monitorimi i kullave Aktivizo monitorimit automotik të kullave - Apliko për një çelës API OCID + Apliko për një çelës API OpenCellID Apliko një çelës për hapjen e të dhënave OpenCellID diff --git a/app/src/main/res/values-uk/translatable_strings.xml b/app/src/main/res/values-uk/translatable_strings.xml index de59f7e33..935666776 100644 --- a/app/src/main/res/values-uk/translatable_strings.xml +++ b/app/src/main/res/values-uk/translatable_strings.xml @@ -119,7 +119,7 @@ Ви не можете відслідковувати данні GPS без сервісу визначення координат. Увімкнути його зараз? Сервіс буде продовжувати роботу після виходу з додатку (зніміть прапорець «закрити повністю») - Отримання OpenCellId API ключа... + Отримання OpenCellID API ключа... Видалено Не вдалося видалити @@ -139,7 +139,7 @@ Контроль за частотою оновлення пристрою\nПоточний вибір: %s Введіть Ваш OpenCellID API ключ тут Увімкнути автоматичний моніторинг стільників - Запит ключа OCID API + Запит ключа OpenCellID API Запит API ключа для доступу до OpenCellID даних Командний інтерфейс AT @@ -179,7 +179,7 @@ Відслідковування стільникової інформації. Відслідковування стільникової інформації призупинено. Лише один запит на добу!\nБудь ласка, спробуйте пізніше. - ID стільника відсутнє в базі даних OCID! + ID стільника відсутнє в базі даних OpenCellID! Тип телефону Оновлювати кожні Оновити зараз… diff --git a/app/src/main/res/values/translatable_strings.xml b/app/src/main/res/values/translatable_strings.xml index 7a948c943..ef664d020 100644 --- a/app/src/main/res/values/translatable_strings.xml +++ b/app/src/main/res/values/translatable_strings.xml @@ -126,7 +126,7 @@ Enter your OpenCellID API Key here Cell Monitoring Enable Automatic Cell Monitoring - Request OCID API Key + Request OpenCellID API Key Request API key for OpenCellID data access @@ -238,7 +238,7 @@ Tracking Cell Information. Stopped tracking Cell Information. Only one new API key request per 24 hours!\nPlease try again later. - Cell ID does not exist in OCID Database! + Cell ID not in OpenCellID Database! Hostile Service Area: Changing LAC Detected! FemtoCell Detection Active. Cell Tracking Active. @@ -266,8 +266,8 @@ OpenCellID data successfully received. Error retrieving OpenCellID data.\nCheck your network! OpenCellID data successfully received.\nMap Markers updated. - Uploaded BTS data to OCID successfully. - Error in uploading BTS data to OCID servers! + Uploaded BTS data to OpenCellID successfully. + Error in uploading BTS data to OpenCellID servers! Restore Successful. Restore database completed successfully. Error restoring database. @@ -322,14 +322,14 @@ AIMSICD threat status, neighboring cells, ciphering method indicator. SIM network provider details, IMEI, TMSI. - Show detailed comparison of the currently connected cell, with the data (if any) found in OCID and highlight the differences. + Show detailed comparison of the currently connected cell, with the data (if any) found in OpenCellID and highlight the differences. View the different DB tables we have. Map of color coded antennas nearby. Interface that allows sending AT commands to Baseband Processor (requires ROOT). Start/stop attack detection and collect cell details into internal database tables. - Start to track cells for display on the Antenna Map Viewer and possibly later upload to OCID. + Start to track cells for display on the Antenna Map Viewer and possibly later upload to OpenCellID. AIMSICD settings such as protection rules, polling times and service behaviour. @@ -342,15 +342,15 @@ Get an API key for using the OpenCellID database to upload and download data… Status Icons and Project explained. - Downloads the OCID Database. - Uploads your BTS to the OCID Database. + Downloads the OpenCellID Database. + Uploads your BTS to the OpenCellID Database. Collect and send error logs. Exit this app. Waiting for location… Unable to restore backup from previous database version due to structural changes! Unique BTS Data BTS Measurements - Imported OCID Data + Imported OpenCellID Data Default MCC Locations Silent SMS EventLog From 8a9401d9bdbd45a15fd87bfbce2d291e29702909 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Wed, 9 Dec 2015 23:15:01 +0100 Subject: [PATCH 66/82] fix #674 --- app/src/main/AndroidManifest.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dea3b147a..3802f97ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.SecUpwN.AIMSICD" + tools:ignore="ProtectedPermissions"> - - - - - - - - - - - - - - - - diff --git a/app/src/system/AndroidManifest.xml b/app/src/system/AndroidManifest.xml new file mode 100644 index 000000000..2c9e3e2ec --- /dev/null +++ b/app/src/system/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 208b7af108fb11171cdc58a1aa43e44cefcb670c Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Thu, 10 Dec 2015 00:08:57 +0100 Subject: [PATCH 68/82] fix ShowToast lint error --- app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java index db8e2df44..1818eb4f1 100644 --- a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java +++ b/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java @@ -5,11 +5,10 @@ */ package com.SecUpwN.AIMSICD.utils; +import android.annotation.SuppressLint; import android.content.Context; import android.os.CountDownTimer; import android.os.Handler; - -import android.view.Gravity; import android.widget.Toast; public class Toaster { @@ -49,6 +48,7 @@ public static void msgLong(final Context context, final String msg) { } new Handler(context.getMainLooper()).post(new Runnable() { + @SuppressLint("ShowToast") @Override public void run() { toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT); From 84dd48c8f653f69115433ec5ceb4dc1dfbc9ced8 Mon Sep 17 00:00:00 2001 From: SecUpwN Date: Fri, 11 Dec 2015 00:54:29 +0100 Subject: [PATCH 69/82] Update OSMBonusPack to 5.5 --- app/build.gradle | 4 ++-- app/libs/osmbonuspack_v5.1.jar | Bin 187969 -> 0 bytes app/libs/osmbonuspack_v5.5.aar | Bin 0 -> 188585 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 app/libs/osmbonuspack_v5.1.jar create mode 100644 app/libs/osmbonuspack_v5.5.aar diff --git a/app/build.gradle b/app/build.gradle index ddb980fc8..052e5abf3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -81,14 +81,14 @@ dependencies { //compile 'com.github.amlcurran.showcaseview:library:5.0.0' compile 'com.android.support:appcompat-v7:22.2.1' //https://github.com/lp0/slf4j-android - compile fileTree(dir: 'libs', include: '*.jar') + compile fileTree(dir: 'libs', ['*.jar', '*.aar']) compile project(':third_party:rootshell') compile 'org.osmdroid:osmdroid-android:4.2' compile 'org.slf4j:slf4j-api:1.7.12' compile 'eu.lp0.slf4j:slf4j-android:1.7.12-0' compile 'com.squareup.okhttp:okhttp:2.6.0' compile 'au.com.bytecode:opencsv:2.4' - compile files('libs/osmbonuspack_v5.1.jar') + compile files('libs/osmbonuspack_v5.5.aar') compile 'com.nineoldandroids:library:2.4.0' compile 'org.apache.commons:commons-lang3:3.3.2' compile 'com.google.code.gson:gson:2.2.4' diff --git a/app/libs/osmbonuspack_v5.1.jar b/app/libs/osmbonuspack_v5.1.jar deleted file mode 100644 index c73f08aaaa3acf7b6354f1fb5748c04d734820e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187969 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 F^nXvqap3>} diff --git a/app/libs/osmbonuspack_v5.5.aar b/app/libs/osmbonuspack_v5.5.aar new file mode 100644 index 0000000000000000000000000000000000000000..e4928e1332c811f2727824fa78437813454bb619 GIT binary patch literal 188585 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 ZJ%N?w!PmDM0Tm$7{{WsA5%>TA literal 0 HcmV?d00001 From a2c7b3046809afb04cc58733a35f059afd3fbfa4 Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Fri, 11 Dec 2015 02:24:45 +0000 Subject: [PATCH 70/82] Switched silent SMS link to Glossary of Terms --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index efa45136c..c64184ced 100644 --- a/README.md +++ b/README.md @@ -43,12 +43,12 @@ AIMSICD is an app to detect [IMSI-Catchers](https://en.wikipedia.org/wiki/IMSI-c AIMSICD attempts to detect IMSI-Catchers through [detection methods](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/230) such as these: -* Check [tower information consistency](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/253) -* Check [LAC/Cell ID consistency](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/91) +* Check [Tower Information Consistency](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/253) +* Check [LAC/Cell ID Consistency](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/91) * Check [Neighbouring Cell Info](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/264) * Prevent [silent app installations](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/151) * Monitor [Signal Strength](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/97) -* Detect [silent SMS](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/69) +* Detect [silent SMS](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/glossary-of-terms#silent-sms) * Detect [FemtoCells](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/6) See our [app goals](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Development-Status#application-goals) and [development status](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Development-Status)! From dbcdc6854a074631103b0d9fb9d8dc9b2b63d838 Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Thu, 10 Dec 2015 22:10:38 +0100 Subject: [PATCH 71/82] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 37.1% (110 of 296 strings) --- .../res/values-nb/translatable_strings.xml | 144 +++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb/translatable_strings.xml b/app/src/main/res/values-nb/translatable_strings.xml index 6192f1e73..bd1276af1 100644 --- a/app/src/main/res/values-nb/translatable_strings.xml +++ b/app/src/main/res/values-nb/translatable_strings.xml @@ -52,5 +52,147 @@ Frisk opp - + Innstillinger + + + + Last opp BTS-data + + + Versjon:  + Android-basert prosjekt for å oppdage og unngå falske basestasjoner (IMSI-fangere) i GSM/UMTS-nettverk. + AIMSICD på GitHub + Dokumentasjon (WIKI) + BIDRA + UTGAVER + ENDRINGSLOGG + LISENS + + + Aktiv sporing nær deg! + Alt OK. + + "Utrygt tjenesteområde. Forlat det!" + "SPRING! Håndsettet er manipulert!" + Trykk status-ikonet under for detaljert informasjon: + + Nettverk-ID: + System-ID: + Basestasjon-ID: + + + + + Systemoppsett + Start automatisk + Start tjenesten automatisk ved oppstart + + + + Meldingsoppsett + Cellesporing + Slå på automatisk cellesporing + + + + + Grensesnittoppsett + Status-ikoner + + Oppfriskningsrate + + + + + + + + + + Kartfremvisningsinnstillinger + Karttype + + + + + + + + + + "Lat: " + "Lon: " + + + Vellykket eksport + + + Tilbakemelding: + Utfør + + + + + + + + Oppdaget stille SMS + Oppdaget stille SMS-melding!\nDetaljer: Se databasefremviser. + + + + + + Lagret ny API-nøkkel. + + Feilsøkingslogger + + Kopier + + Stopp + Start + + DETALJERT FORKLARING + + + + + + + Avbryt + OK + + Aktiver vibrering + Vibrer når meldinger endres + Vibrer på trusselnivå + Velg minimumstrusselnivå å vibrere på + + Normal + Medium + Alarm + + + + Hvit + Terreng + Normal + Manuell + Automatisk + 2 sek + 5 sek + 10 sek + 25 sek + 45 sek + 1 min + 5 min + 2 sek + 5 sek + 10 sek + 20 sek + 30 sek + 10 min + + Oppsett + + From 03cb1c1f5775c5a274934941c40c7a214de3be25 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Sat, 12 Dec 2015 01:39:32 +0100 Subject: [PATCH 72/82] load osmbonuspack as maven dependency --- app/build.gradle | 5 +++-- app/libs/osmbonuspack_v5.1.jar | Bin 187969 -> 0 bytes build.gradle | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 app/libs/osmbonuspack_v5.1.jar diff --git a/app/build.gradle b/app/build.gradle index 9841600f9..9b19cca14 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -81,14 +81,15 @@ dependencies { //compile 'com.github.amlcurran.showcaseview:library:5.0.0' compile 'com.android.support:appcompat-v7:22.2.1' //https://github.com/lp0/slf4j-android - compile fileTree(include: '*.jar', dir: 'libs') compile project(':third_party:rootshell') compile 'org.osmdroid:osmdroid-android:4.2' compile 'org.slf4j:slf4j-api:1.7.12' compile 'eu.lp0.slf4j:slf4j-android:1.7.12-0' compile 'com.squareup.okhttp:okhttp:2.6.0' compile 'au.com.bytecode:opencsv:2.4' - compile files('libs/osmbonuspack_v5.1.jar') + + //This git hash resolves to version 5.5 + compile 'com.github.MKergall.osmbonuspack:OSMBonusPack:2e8bca20f7' compile 'com.nineoldandroids:library:2.4.0' compile 'org.apache.commons:commons-lang3:3.3.2' compile 'com.google.code.gson:gson:2.2.4' diff --git a/app/libs/osmbonuspack_v5.1.jar b/app/libs/osmbonuspack_v5.1.jar deleted file mode 100644 index c73f08aaaa3acf7b6354f1fb5748c04d734820e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187969 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 F^nXvqap3>} diff --git a/build.gradle b/build.gradle index 14ee0ac7c..6a90b86c7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { - mavenCentral() jcenter() } dependencies { @@ -11,7 +10,7 @@ buildscript { allprojects { repositories { - mavenCentral() + jcenter() maven { url "https://jitpack.io" } } } From 17416617107465503c6e44e492acc43824ea1380 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Sat, 12 Dec 2015 03:31:05 +0100 Subject: [PATCH 73/82] remove redundant dependency declarations --- app/build.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9b19cca14..c5817a41c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,7 +82,6 @@ dependencies { compile 'com.android.support:appcompat-v7:22.2.1' //https://github.com/lp0/slf4j-android compile project(':third_party:rootshell') - compile 'org.osmdroid:osmdroid-android:4.2' compile 'org.slf4j:slf4j-api:1.7.12' compile 'eu.lp0.slf4j:slf4j-android:1.7.12-0' compile 'com.squareup.okhttp:okhttp:2.6.0' @@ -90,9 +89,6 @@ dependencies { //This git hash resolves to version 5.5 compile 'com.github.MKergall.osmbonuspack:OSMBonusPack:2e8bca20f7' - compile 'com.nineoldandroids:library:2.4.0' - compile 'org.apache.commons:commons-lang3:3.3.2' - compile 'com.google.code.gson:gson:2.2.4' compile 'com.github.kaichunlin.transition:core:0.9.2' compile 'io.freefair.android-util:logging:1.1.0' //debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' From 0af308208e9e3f764de56828509840b6f94ee81c Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Sat, 12 Dec 2015 15:48:41 +0100 Subject: [PATCH 74/82] remove all permission which are not used (accordingly to https://github.com/RomainPiel/AndroidPermissionsUsage) close #636 --- app/src/main/AndroidManifest.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 292599926..afff2acd4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,27 +15,14 @@ - - - - - - - - - - - - - - - - - - From 08b5810c097386c472d9d25efd6dba17eeec82d4 Mon Sep 17 00:00:00 2001 From: SecUpwN Date: Sun, 13 Dec 2015 21:25:19 +0100 Subject: [PATCH 77/82] Removed unused SmsReceiver.java --- .../SecUpwN/AIMSICD/receiver/SmsReceiver.java | 133 ------------------ 1 file changed, 133 deletions(-) delete mode 100644 app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java b/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java deleted file mode 100644 index d1180a676..000000000 --- a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/SmsReceiver.java +++ /dev/null @@ -1,133 +0,0 @@ -/* Android IMSI-Catcher Detector | (c) AIMSICD Privacy Project - * ----------------------------------------------------------- - * LICENSE: http://git.io/vki47 | TERMS: http://git.io/vki4o - * ----------------------------------------------------------- - */ -package com.SecUpwN.AIMSICD.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.telephony.SmsMessage; - -import com.SecUpwN.AIMSICD.service.CellTracker; - -import java.util.ArrayList; -import java.util.List; - -import io.freefair.android.util.logging.AndroidLogger; -import io.freefair.android.util.logging.Logger; - - -/** - * Description: The SMS receiver class that handles the SMS PDU data - * - * Dependencies: AndroidManifest.xml (receiver) - * - * Permissions: To read and intercept various SMS/MMS/WAP push messages, we need - * at least 3 different Android permissions: - * - * android.permission.READ_SMS - * android.permission.RECEIVE_MMS - * android.permission.RECEIVE_SMS - * android.permission.RECEIVE_WAP_PUSH - * - * To read silent SMS from radio logcat, we also need: - * - * android.permission.READ_LOGS - * - * Notes: 1) 3GPP TS 23.040 9.2.3.9 specifies that Type Zero messages are indicated - * by TP_PID field set to value 0x40 = 64 = 01000000 - * 2) For others see: http://web.tiscali.it/richard/tlc/articoli/sms3.htm - * 3) http://www.etsi.org/deliver/etsi_ts/123000_123099/123040/12.02.00_60/ts_123040v120200p.pdf - * 4) Here: - * TP-MTI = Message Type Indicator - - * TP-PID = Protocol IDentifier - - * TP-MMS = More Messages to Send - - * - * Issues: - * [ ] TODO: Add silent MMS check ? -- Is this correctly understood? - * [ ] TODO: Add silent WAP PUSH check - * [ ] TODO: https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/178 - * [ ] Possible blocking issue due to AndroidManifest.xml permissions - * [ ] Status Report Indication (TP-SRI) -- requested ? - * [ ] Validity period (TP-VP) -- too short ? - * [ ] The service centre time stamp (TP-SCTS) -- wrong date? - * - * Log: - * --------- beginning of /dev/log/main - * I/AIMSICD_SmsReceiver(28544): Pdu data: firstByte = 8 mti = 0 TP_PID = 128 - * I/AIMSICD_SmsReceiver(28544): Type 0 Message received, Sender: +38631XXXXXX Message: t - * I/CellTracker(28544): neighbouringCellInfo Size - 1 - * I/CellTracker(28544): neighbouringCellInfo - CID:-1 LAC:-1 RSSI:-85 PSC:183 - * - * - * ChangeLog: 2015-02-10 banjaxbanjo - added code to dump full SMS PDU to logcat - * 2015-02-11 E:V:A - changed from "||" to "&& mti==0" - * - */ -public class SmsReceiver extends BroadcastReceiver { - - private final Logger log = AndroidLogger.forClass(SmsReceiver.class); - - public void onReceive(Context context, Intent intent) { - try { - final Bundle bundle = intent.getExtras(); - if (bundle != null) { - Object[] pdus = (Object[]) bundle.get("pdus"); - final List messages = new ArrayList<>(); - StringBuilder sb = new StringBuilder(); - String full_pdu_string = ""; - for (Object pdu : pdus) { - byte smsPdu[] = (byte[]) pdu; - - // Dump the full SMS in PDU format (HEX string) to logcat - try { - for(int xx = 0; xx < smsPdu.length; xx++) { - String test = Integer.toHexString(smsPdu[xx] & 0xff); - if (test.length() <= 1){ test = "0"+test; } - sb.append(test); - } - full_pdu_string = sb.toString(); - } catch (Exception err) { - log.error("Exception PDU smsReceiver" + err); - } - - // We may also need to consider catching WAP PUSH SMS messages - // as they can also be hidden from user. -- E:V:A - int firstByte = smsPdu[0] & 0xff; - int mti = firstByte & 0x3; // 3 = 0000 0011 (bits 0-1) - //int mms = firstByte & 0x4; // 4 = 0000 0100 (bit 3) - //int sri = firstByte & 0x10; // 16 = 0001 0000 (bit 5) - int pID = smsPdu[1] & 0xc0; // 192 = 1100 0000 - log.info("PDU Data: firstByte: " + firstByte + " TP-MTI: " + mti + " TP-PID: " + pID); - // Need checking! --EVA - if (pID == 0x40 && mti == 0) { - messages.add(SmsMessage.createFromPdu((byte[]) pdu)); - } - } - - if (messages.size() > 0) { - for (SmsMessage sms : messages) { - Intent smsIntent = new Intent(CellTracker.SILENT_SMS); - Bundle smsData = new Bundle(); - smsData.putString("address", sms.getOriginatingAddress()); - smsData.putString("display_address", sms.getDisplayOriginatingAddress()); - smsData.putString("class", sms.getMessageClass().name()); - smsData.putString("service_centre", sms.getServiceCenterAddress()); - smsData.putString("message", sms.getMessageBody()); - smsIntent.putExtras(smsData); - context.sendBroadcast(smsIntent); - log.info("Type-0 SMS received! Sender: " - + sms.getOriginatingAddress() + " Message: " - + sms.getMessageBody()); - } - } - } - } catch (NullPointerException npe) { - log.error("Exception smsReceiver", npe); - } - } - -} From cd5d9de30fc58392142a7b3661cba8f9204822ca Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Sun, 13 Dec 2015 21:07:56 +0000 Subject: [PATCH 78/82] Merged Debugging Guide from WIKI --- CONTRIBUTING.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a306e86b..a983c440e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -75,4 +75,60 @@ Useful links to help you with correctly formatting posts. #### DEBUGGING -* Please follow our instructions on [how to correctly submit Issues](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Submitting-Issues). +#### DEBUGGING + +Thanks for helping us squashing bugs! Please be patient. + +--- +**Important Bug Submission Rules:** + +1. **SAFETY FIRST:** Remove CID, LAT, IMEI, IMSI and phone number from logs you submit! +2. ALWAYS use the [latest release](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/releases). Preferrably [build the `development` branch from source](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Building). +3. If you use [Xprivacy](https://github.com/M66B/XPrivacy) read and understand [THIS](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Permissions) first! Give our app another try after reading. +4. App still mocking around? See our [open Issues](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues) and look if your Issue already exists. +5. If your Issue does not exist yet, open a new Issue and give it a short descriptive title. +6. Describe your Issue as thoroughly as possible and *add logs* so that we can reproduce it. +8. Maintain your filed Issues! Nothing is more annoying than unresponsive bug reporters. + +--- + +In all cases, you **MUST** include the following: + +* AIMSICD version (see the About-Tab within our App) +* Your exact FW specification (ROM, AOS API, etc.) +* Your exact HW specification (processor, model number, etc.) +* The output of getprop command to a Pastebin-Site such as [PIE-Bin](https://defuse.ca/pastebin.htm) +* Logcat from button `Debugging` in Navigation Drawer (remove personal data) +* Feel free to attach any other logs made by a logcat tool like [MatLog](https://github.com/plusCubed/matlog) + +--- + +Command line junkie? + +Then you can use the following shell function to help you get only relevant logcat entries. Copy and paste the following to your terminal shell: + +```bash +alias logrep='logcat -d -v time -b main -b system -b radio|grep -iE $@' +``` + +Furthermore, here are some great commands that will: + + 1. Create a log directory in: `/sdcard/aimsicd_log/` + 2. cd into that directory + 3. Clear all the existing logcats + 4. Run AIMSICD and wait for a key press to kill it + 5. Save a full *logcat* (excluding *radio*) into `/sdcard/aimsicd_log/aimdump.log` + +Copy and paste the following to your android rooted shell: + +```bash +alias cdaim='mkdir /sdcard/aimsicd_log; cd /sdcard/aimsicd_log' +alias logclr='logcat -c -b main -b system -b radio -b events' +alias logdmp='logcat -d -v threadtime -b main -b system -b events -f /sdcard/aimsicd_log/aimdump.log' +export DUMTXT="When bug occurs, press any key to kill app and dump logcat to file..." +alias aimrun='cdaim; logclr; am start -n com.SecUpwN.AIMSICD/.AIMSICD; read dummy?"${DUMTXT}"; am force-stop com.SecUpwN.AIMSICD; logdmp;' +``` +To run it, just type: `aimrun`. +If you want to also supply *radio* logcat, add `-b radio` somewhere in the `logdmp` alias, but know that your GPS location and cell info may be included when you do that. + +--- From c44d66eea47e81a682754020e72eca8cd90d7d9b Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Sun, 13 Dec 2015 21:24:52 +0000 Subject: [PATCH 79/82] Enlarged project name a bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c64184ced..cf6ac458d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -### Android IMSI-Catcher Detector +# Android IMSI-Catcher Detector [![BuildStatus](https://travis-ci.org/SecUpwN/Android-IMSI-Catcher-Detector.svg)](https://travis-ci.org/SecUpwN/Android-IMSI-Catcher-Detector) [![DevelopmentStatus](http://img.shields.io/badge/Development-ALPHA-brightgreen.svg)](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/wiki/Development-Status) [![CoverityScan](https://scan.coverity.com/projects/3346/badge.svg)](https://scan.coverity.com/projects/3346) [![Translations](https://hosted.weblate.org/widgets/aimsicd/-/shields-badge.svg)](https://hosted.weblate.org/projects/aimsicd/strings/) [![Bountysource](https://www.bountysource.com/badge/team?team_id=40338&style=bounties_received)](https://www.bountysource.com/teams/android-imsi-catcher-detector/issues?utm_source=Android%20IMSI-Catcher%20Detector&utm_medium=shield&utm_campaign=bounties_received) From f720f59bc1004f3021103f432be1f502333998e2 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 14 Dec 2015 00:01:56 +0100 Subject: [PATCH 80/82] rename the `app` module to `AIMSICD` see also: https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/658#issuecomment-164204900 --- {app => AIMSICD}/.gitignore | 0 {app => AIMSICD}/build.gradle | 0 {app => AIMSICD}/proguard-rules.txt | 0 .../java/com/SecUpwN/AIMSICD/test/Detection1.java | 0 .../java/com/SecUpwN/AIMSICD/test/GetProp.java | 0 {app => AIMSICD}/src/main/AndroidManifest.xml | 0 {app => AIMSICD}/src/main/assets/CREDITS | 0 .../src/main/assets/CreateDBe_import.sql | 0 {app => AIMSICD}/src/main/assets/aimsicd.db | Bin {app => AIMSICD}/src/main/assets/aimsicd.sql | 0 .../src/main/assets/default_mcc_locations.csv | 0 .../src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java | 0 .../main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java | 0 .../SecUpwN/AIMSICD/activities/BaseActivity.java | 0 .../AIMSICD/activities/CreditsRollActivity.java | 0 .../com/SecUpwN/AIMSICD/activities/DebugLogs.java | 0 .../SecUpwN/AIMSICD/activities/MapPrefActivity.java | 0 .../AIMSICD/activities/MapViewerOsmDroid.java | 0 .../AIMSICD/activities/OpenCellIdActivity.java | 0 .../SecUpwN/AIMSICD/activities/PrefActivity.java | 0 .../SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java | 0 .../AIMSICD/adapters/BaseInflaterAdapter.java | 0 .../AIMSICD/adapters/BtsMeasureCardInflater.java | 0 .../AIMSICD/adapters/BtsMeasureItemData.java | 0 .../com/SecUpwN/AIMSICD/adapters/CardItemData.java | 0 .../SecUpwN/AIMSICD/adapters/CellCardInflater.java | 0 .../AIMSICD/adapters/DbViewerSpinnerAdapter.java | 0 .../AIMSICD/adapters/DbeImportCardInflater.java | 0 .../SecUpwN/AIMSICD/adapters/DbeImportItemData.java | 0 .../adapters/DefaultLocationCardInflater.java | 0 .../AIMSICD/adapters/DetailsPagerAdapter.java | 0 .../SecUpwN/AIMSICD/adapters/DrawerMenuAdapter.java | 0 .../AIMSICD/adapters/EventLogCardInflater.java | 0 .../SecUpwN/AIMSICD/adapters/EventLogItemData.java | 0 .../Holders/ViewTableNameSpinnerHolder.java | 0 .../AIMSICD/adapters/IAdapterViewInflater.java | 0 .../adapters/MeasuredCellStrengthCardData.java | 0 .../adapters/MeasuredCellStrengthCardInflater.java | 0 .../AIMSICD/adapters/OpenCellIdCardInflater.java | 0 .../SecUpwN/AIMSICD/adapters/SilentSmsCardData.java | 0 .../AIMSICD/adapters/SilentSmsCardInflater.java | 0 .../AIMSICD/adapters/UniqueBtsCardInflater.java | 0 .../SecUpwN/AIMSICD/adapters/UniqueBtsItemData.java | 0 .../SecUpwN/AIMSICD/constants/DBTableColumnIds.java | 0 .../com/SecUpwN/AIMSICD/constants/DrawerMenu.java | 0 .../com/SecUpwN/AIMSICD/constants/Examples.java | 0 .../com/SecUpwN/AIMSICD/constants/TinyDbKeys.java | 0 .../drawer/DrawerMenuActivityConfiguration.java | 0 .../com/SecUpwN/AIMSICD/drawer/DrawerMenuItem.java | 0 .../SecUpwN/AIMSICD/drawer/DrawerMenuSection.java | 0 .../com/SecUpwN/AIMSICD/drawer/NavDrawerItem.java | 0 .../com/SecUpwN/AIMSICD/enums/StatesDbViewer.java | 0 .../SecUpwN/AIMSICD/fragments/AboutFragment.java | 0 .../AIMSICD/fragments/AtCommandFragment.java | 0 .../SecUpwN/AIMSICD/fragments/CellInfoFragment.java | 0 .../SecUpwN/AIMSICD/fragments/CreditsRollView.java | 0 .../SecUpwN/AIMSICD/fragments/DbViewerFragment.java | 0 .../AIMSICD/fragments/DetailsContainerFragment.java | 0 .../SecUpwN/AIMSICD/fragments/DeviceFragment.java | 0 .../SecUpwN/AIMSICD/fragments/MapPrefFragment.java | 0 .../com/SecUpwN/AIMSICD/fragments/PrefFragment.java | 0 .../AIMSICD/map/CellTowerGridMarkerClusterer.java | 0 .../com/SecUpwN/AIMSICD/map/CellTowerMarker.java | 0 .../java/com/SecUpwN/AIMSICD/map/MarkerData.java | 0 .../AIMSICD/receiver/BootCompletedReceiver.java | 0 .../SecUpwN/AIMSICD/rilexecutor/DetectResult.java | 0 .../com/SecUpwN/AIMSICD/rilexecutor/HexDump.java | 0 .../SecUpwN/AIMSICD/rilexecutor/OemRilExecutor.java | 0 .../com/SecUpwN/AIMSICD/rilexecutor/RawResult.java | 0 .../SecUpwN/AIMSICD/rilexecutor/RilExecutor.java | 0 .../rilexecutor/SamsungMulticlientRilExecutor.java | 0 .../SecUpwN/AIMSICD/rilexecutor/StringsResult.java | 0 .../AIMSICD/service/AccelerometerMonitor.java | 0 .../com/SecUpwN/AIMSICD/service/AimsicdService.java | 0 .../com/SecUpwN/AIMSICD/service/CellTracker.java | 0 .../SecUpwN/AIMSICD/service/LocationTracker.java | 0 .../AIMSICD/service/SignalStrengthTracker.java | 0 .../smsdetection/AdvanceUserBaseAdapter.java | 0 .../smsdetection/AdvanceUserBaseSmsAdapter.java | 0 .../AIMSICD/smsdetection/AdvanceUserItems.java | 0 .../AIMSICD/smsdetection/AdvancedUserActivity.java | 0 .../smsdetection/AdvancedUserSmsActivity.java | 0 .../smsdetection/CapturedSmsCardInflater.java | 0 .../AIMSICD/smsdetection/CapturedSmsData.java | 0 .../smsdetection/DetectionStringsCardInflater.java | 0 .../AIMSICD/smsdetection/DetectionStringsData.java | 0 .../SecUpwN/AIMSICD/smsdetection/SmsDetector.java | 0 .../com/SecUpwN/AIMSICD/utils/AsyncResponse.java | 0 .../com/SecUpwN/AIMSICD/utils/BaseAsyncTask.java | 0 .../com/SecUpwN/AIMSICD/utils/CMDProcessor.java | 0 .../main/java/com/SecUpwN/AIMSICD/utils/Cell.java | 0 .../com/SecUpwN/AIMSICD/utils/ChildProcess.java | 0 .../com/SecUpwN/AIMSICD/utils/CommandResult.java | 0 .../main/java/com/SecUpwN/AIMSICD/utils/Device.java | 0 .../java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java | 0 .../java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java | 0 .../java/com/SecUpwN/AIMSICD/utils/GeoLocation.java | 0 .../java/com/SecUpwN/AIMSICD/utils/Helpers.java | 0 .../main/java/com/SecUpwN/AIMSICD/utils/Icon.java | 0 .../com/SecUpwN/AIMSICD/utils/LocationServices.java | 0 .../java/com/SecUpwN/AIMSICD/utils/MiscUtils.java | 0 .../java/com/SecUpwN/AIMSICD/utils/OCIDCSV.java | 0 .../java/com/SecUpwN/AIMSICD/utils/OemCommands.java | 0 .../java/com/SecUpwN/AIMSICD/utils/RequestTask.java | 0 .../AIMSICD/utils/StackOverflowXmlParser.java | 0 .../main/java/com/SecUpwN/AIMSICD/utils/Status.java | 0 .../AIMSICD/utils/SystemPropertiesReflection.java | 0 .../main/java/com/SecUpwN/AIMSICD/utils/TinyDB.java | 0 .../java/com/SecUpwN/AIMSICD/utils/Toaster.java | 0 .../SecUpwN/AIMSICD/utils/TruncatedLocation.java | 0 .../AIMSICD/utils/atcmd/AtCommandTerminal.java | 0 .../SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java | 0 .../com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java | 0 .../SecUpwN/AIMSICD/widget/HighlightTextView.java | 0 .../AIMSICD/widget/ScaledTransitionHandler.java | 0 .../src/main/res/anim/action_button_help.xml | 0 .../src/main/res/drawable-hdpi/cell_tower.png | Bin .../src/main/res/drawable-hdpi/flat_danger.png | Bin .../src/main/res/drawable-hdpi/flat_high.png | Bin .../src/main/res/drawable-hdpi/flat_idle.png | Bin .../src/main/res/drawable-hdpi/flat_medium.png | Bin .../src/main/res/drawable-hdpi/flat_ok.png | Bin .../src/main/res/drawable-hdpi/flat_skull.png | Bin .../src/main/res/drawable-hdpi/ic_action_about.png | Bin .../main/res/drawable-hdpi/ic_action_computer.png | Bin .../main/res/drawable-hdpi/ic_action_download.png | Bin .../res/drawable-hdpi/ic_action_import_export.png | Bin .../res/drawable-hdpi/ic_action_location_found.png | Bin .../res/drawable-hdpi/ic_action_location_off.png | Bin .../src/main/res/drawable-hdpi/ic_action_map.png | Bin .../res/drawable-hdpi/ic_action_network_cell.png | Bin .../ic_action_network_cell_not_tracked.png | Bin .../src/main/res/drawable-hdpi/ic_action_phone.png | Bin .../src/main/res/drawable-hdpi/ic_action_remove.png | Bin .../main/res/drawable-hdpi/ic_action_send_logs.png | Bin .../main/res/drawable-hdpi/ic_action_settings.png | Bin .../main/res/drawable-hdpi/ic_action_storage.png | Bin .../src/main/res/drawable-hdpi/ic_drawer.png | Bin .../src/main/res/drawable-hdpi/ic_map_pin_blue.png | Bin .../src/main/res/drawable-hdpi/ic_map_pin_green.png | Bin .../main/res/drawable-hdpi/ic_map_pin_orange.png | Bin .../src/main/res/drawable-hdpi/ic_map_pin_red.png | Bin .../src/main/res/drawable-hdpi/sense_danger.png | Bin .../src/main/res/drawable-hdpi/sense_high.png | Bin .../src/main/res/drawable-hdpi/sense_idle.png | Bin .../src/main/res/drawable-hdpi/sense_medium.png | Bin .../src/main/res/drawable-hdpi/sense_ok.png | Bin .../src/main/res/drawable-hdpi/sense_skull.png | Bin .../res/drawable-hdpi/stat_sys_download_anim0.png | Bin .../res/drawable-hdpi/stat_sys_upload_anim0.png | Bin .../src/main/res/drawable-hdpi/track_cell.png | Bin .../src/main/res/drawable-hdpi/untrack_cell.png | Bin .../res/drawable-hdpi/vp_background_texture.png | Bin .../src/main/res/drawable-hdpi/white_danger.png | Bin .../src/main/res/drawable-hdpi/white_high.png | Bin .../src/main/res/drawable-hdpi/white_idle.png | Bin .../src/main/res/drawable-hdpi/white_medium.png | Bin .../src/main/res/drawable-hdpi/white_ok.png | Bin .../src/main/res/drawable-hdpi/white_skull.png | Bin .../src/main/res/drawable-ldpi/cell_tower.png | Bin .../src/main/res/drawable-ldpi/flat_danger.png | Bin .../src/main/res/drawable-ldpi/flat_high.png | Bin .../src/main/res/drawable-ldpi/flat_idle.png | Bin .../src/main/res/drawable-ldpi/flat_medium.png | Bin .../src/main/res/drawable-ldpi/flat_ok.png | Bin .../src/main/res/drawable-ldpi/flat_skull.png | Bin .../main/res/drawable-ldpi/ic_action_download.png | Bin .../res/drawable-ldpi/ic_action_location_off.png | Bin .../res/drawable-ldpi/ic_action_network_cell.png | Bin .../ic_action_network_cell_not_tracked.png | Bin .../src/main/res/drawable-ldpi/sense_danger.png | Bin .../src/main/res/drawable-ldpi/sense_high.png | Bin .../src/main/res/drawable-ldpi/sense_idle.png | Bin .../src/main/res/drawable-ldpi/sense_medium.png | Bin .../src/main/res/drawable-ldpi/sense_ok.png | Bin .../src/main/res/drawable-ldpi/sense_skull.png | Bin .../res/drawable-ldpi/stat_sys_download_anim0.png | Bin .../res/drawable-ldpi/stat_sys_upload_anim0.png | Bin .../src/main/res/drawable-ldpi/track_cell.png | Bin .../src/main/res/drawable-ldpi/untrack_cell.png | Bin .../src/main/res/drawable-ldpi/white_danger.png | Bin .../src/main/res/drawable-ldpi/white_high.png | Bin .../src/main/res/drawable-ldpi/white_idle.png | Bin .../src/main/res/drawable-ldpi/white_medium.png | Bin .../src/main/res/drawable-ldpi/white_ok.png | Bin .../src/main/res/drawable-ldpi/white_skull.png | Bin .../src/main/res/drawable-mdpi/cell_tower.png | Bin .../src/main/res/drawable-mdpi/flat_danger.png | Bin .../src/main/res/drawable-mdpi/flat_high.png | Bin .../src/main/res/drawable-mdpi/flat_idle.png | Bin .../src/main/res/drawable-mdpi/flat_medium.png | Bin .../src/main/res/drawable-mdpi/flat_ok.png | Bin .../src/main/res/drawable-mdpi/flat_skull.png | Bin .../src/main/res/drawable-mdpi/ic_action_about.png | Bin .../main/res/drawable-mdpi/ic_action_computer.png | Bin .../main/res/drawable-mdpi/ic_action_download.png | Bin .../res/drawable-mdpi/ic_action_import_export.png | Bin .../res/drawable-mdpi/ic_action_location_found.png | Bin .../res/drawable-mdpi/ic_action_location_off.png | Bin .../src/main/res/drawable-mdpi/ic_action_map.png | Bin .../res/drawable-mdpi/ic_action_network_cell.png | Bin .../ic_action_network_cell_not_tracked.png | Bin .../src/main/res/drawable-mdpi/ic_action_phone.png | Bin .../src/main/res/drawable-mdpi/ic_action_remove.png | Bin .../main/res/drawable-mdpi/ic_action_send_logs.png | Bin .../main/res/drawable-mdpi/ic_action_settings.png | Bin .../main/res/drawable-mdpi/ic_action_storage.png | Bin .../src/main/res/drawable-mdpi/ic_drawer.png | Bin .../src/main/res/drawable-mdpi/ic_map_pin_blue.png | Bin .../src/main/res/drawable-mdpi/ic_map_pin_green.png | Bin .../main/res/drawable-mdpi/ic_map_pin_orange.png | Bin .../src/main/res/drawable-mdpi/ic_map_pin_red.png | Bin .../src/main/res/drawable-mdpi/sense_danger.png | Bin .../src/main/res/drawable-mdpi/sense_high.png | Bin .../src/main/res/drawable-mdpi/sense_idle.png | Bin .../src/main/res/drawable-mdpi/sense_medium.png | Bin .../src/main/res/drawable-mdpi/sense_ok.png | Bin .../src/main/res/drawable-mdpi/sense_skull.png | Bin .../res/drawable-mdpi/stat_sys_download_anim0.png | Bin .../res/drawable-mdpi/stat_sys_upload_anim0.png | Bin .../src/main/res/drawable-mdpi/track_cell.png | Bin .../src/main/res/drawable-mdpi/untrack_cell.png | Bin .../res/drawable-mdpi/vp_background_texture.png | Bin .../src/main/res/drawable-mdpi/white_danger.png | Bin .../src/main/res/drawable-mdpi/white_high.png | Bin .../src/main/res/drawable-mdpi/white_idle.png | Bin .../src/main/res/drawable-mdpi/white_medium.png | Bin .../src/main/res/drawable-mdpi/white_ok.png | Bin .../src/main/res/drawable-mdpi/white_skull.png | Bin .../src/main/res/drawable-xhdpi/flat_danger.png | Bin .../src/main/res/drawable-xhdpi/flat_high.png | Bin .../src/main/res/drawable-xhdpi/flat_idle.png | Bin .../src/main/res/drawable-xhdpi/flat_medium.png | Bin .../src/main/res/drawable-xhdpi/flat_ok.png | Bin .../src/main/res/drawable-xhdpi/flat_skull.png | Bin .../main/res/drawable-xhdpi/ic_action_send_logs.png | Bin .../src/main/res/drawable-xhdpi/ic_map_pin_blue.png | Bin .../main/res/drawable-xhdpi/ic_map_pin_green.png | Bin .../main/res/drawable-xhdpi/ic_map_pin_orange.png | Bin .../src/main/res/drawable-xhdpi/ic_map_pin_red.png | Bin .../src/main/res/drawable-xhdpi/sense_danger.png | Bin .../src/main/res/drawable-xhdpi/sense_high.png | Bin .../src/main/res/drawable-xhdpi/sense_idle.png | Bin .../src/main/res/drawable-xhdpi/sense_medium.png | Bin .../src/main/res/drawable-xhdpi/sense_ok.png | Bin .../src/main/res/drawable-xhdpi/sense_skull.png | Bin .../src/main/res/drawable-xhdpi/white_danger.png | Bin .../src/main/res/drawable-xhdpi/white_high.png | Bin .../src/main/res/drawable-xhdpi/white_idle.png | Bin .../src/main/res/drawable-xhdpi/white_medium.png | Bin .../src/main/res/drawable-xhdpi/white_ok.png | Bin .../src/main/res/drawable-xhdpi/white_skull.png | Bin .../src/main/res/drawable-xxhdpi/flat_danger.png | Bin .../src/main/res/drawable-xxhdpi/flat_high.png | Bin .../src/main/res/drawable-xxhdpi/flat_idle.png | Bin .../src/main/res/drawable-xxhdpi/flat_medium.png | Bin .../src/main/res/drawable-xxhdpi/flat_ok.png | Bin .../src/main/res/drawable-xxhdpi/flat_skull.png | Bin .../res/drawable-xxhdpi/ic_action_send_logs.png | Bin .../main/res/drawable-xxhdpi/ic_map_pin_blue.png | Bin .../main/res/drawable-xxhdpi/ic_map_pin_green.png | Bin .../main/res/drawable-xxhdpi/ic_map_pin_orange.png | Bin .../src/main/res/drawable-xxhdpi/ic_map_pin_red.png | Bin .../src/main/res/drawable-xxhdpi/sense_danger.png | Bin .../src/main/res/drawable-xxhdpi/sense_high.png | Bin .../src/main/res/drawable-xxhdpi/sense_idle.png | Bin .../src/main/res/drawable-xxhdpi/sense_medium.png | Bin .../src/main/res/drawable-xxhdpi/sense_ok.png | Bin .../src/main/res/drawable-xxhdpi/sense_skull.png | Bin .../src/main/res/drawable-xxhdpi/white_danger.png | Bin .../src/main/res/drawable-xxhdpi/white_high.png | Bin .../src/main/res/drawable-xxhdpi/white_idle.png | Bin .../src/main/res/drawable-xxhdpi/white_medium.png | Bin .../src/main/res/drawable-xxhdpi/white_ok.png | Bin .../src/main/res/drawable-xxhdpi/white_skull.png | Bin .../src/main/res/drawable-xxxhdpi/flat_danger.png | Bin .../src/main/res/drawable-xxxhdpi/flat_high.png | Bin .../src/main/res/drawable-xxxhdpi/flat_idle.png | Bin .../src/main/res/drawable-xxxhdpi/flat_medium.png | Bin .../src/main/res/drawable-xxxhdpi/flat_ok.png | Bin .../src/main/res/drawable-xxxhdpi/flat_skull.png | Bin .../drawable-xxxhdpi/ic_action_delete_database.png | Bin .../src/main/res/drawable-xxxhdpi/ic_info.png | Bin .../src/main/res/drawable-xxxhdpi/sense_danger.png | Bin .../src/main/res/drawable-xxxhdpi/sense_high.png | Bin .../src/main/res/drawable-xxxhdpi/sense_idle.png | Bin .../src/main/res/drawable-xxxhdpi/sense_medium.png | Bin .../src/main/res/drawable-xxxhdpi/sense_ok.png | Bin .../src/main/res/drawable-xxxhdpi/sense_skull.png | Bin .../src/main/res/drawable-xxxhdpi/white_danger.png | Bin .../src/main/res/drawable-xxxhdpi/white_high.png | Bin .../src/main/res/drawable-xxxhdpi/white_idle.png | Bin .../src/main/res/drawable-xxxhdpi/white_medium.png | Bin .../src/main/res/drawable-xxxhdpi/white_ok.png | Bin .../src/main/res/drawable-xxxhdpi/white_skull.png | Bin .../src/main/res/drawable/empty_icon.xml | 0 .../src/main/res/drawable/layer_card_background.xml | 0 .../res/drawable/layer_card_background_selected.xml | 0 .../src/main/res/drawable/pager_background.xml | 0 .../src/main/res/drawable/progress_bar_states.xml | 0 .../main/res/drawable/selector_card_background.xml | 0 .../src/main/res/layout/about_fragment.xml | 0 .../res/layout/actionbar_indeterminate_progress.xml | 0 .../main/res/layout/activity_advanced_sms_user.xml | 0 .../src/main/res/layout/activity_advanced_user.xml | 0 .../src/main/res/layout/activity_debug_logs.xml | 0 .../src/main/res/layout/activity_open_cell_id.xml | 0 .../src/main/res/layout/adv_user_sms_listview.xml | 0 .../src/main/res/layout/adv_user_strings_list.xml | 0 .../src/main/res/layout/at_command_fragment.xml | 0 .../src/main/res/layout/bonuspack_bubble.xml | 0 .../src/main/res/layout/bts_measure_data.xml | 0 .../src/main/res/layout/cell_fragment.xml | 0 {app => AIMSICD}/src/main/res/layout/cell_items.xml | 0 {app => AIMSICD}/src/main/res/layout/creditroll.xml | 0 {app => AIMSICD}/src/main/res/layout/db_view.xml | 0 .../src/main/res/layout/dbe_import_items.xml | 0 .../src/main/res/layout/default_location_items.xml | 0 .../main/res/layout/detection_sms_db_listview.xml | 0 .../src/main/res/layout/detection_strings_items.xml | 0 {app => AIMSICD}/src/main/res/layout/device.xml | 0 .../src/main/res/layout/drawer_item.xml | 0 .../src/main/res/layout/drawer_section.xml | 0 .../src/main/res/layout/eventlog_items.xml | 0 .../main/res/layout/fragment_details_container.xml | 0 .../src/main/res/layout/inc_buttonbar_divider.xml | 0 .../src/main/res/layout/item_spinner_db_viewer.xml | 0 {app => AIMSICD}/src/main/res/layout/main.xml | 0 {app => AIMSICD}/src/main/res/layout/map.xml | 0 .../src/main/res/layout/marker_info_window.xml | 0 .../src/main/res/layout/measured_signal_str.xml | 0 .../src/main/res/layout/opencelid_items.xml | 0 .../src/main/res/layout/silent_sms_items.xml | 0 .../src/main/res/layout/unique_bts_data.xml | 0 .../src/main/res/menu/activity_debug_logs.xml | 0 .../src/main/res/menu/map_viewer_menu.xml | 0 .../src/main/res/values-cs/translatable_strings.xml | 0 .../src/main/res/values-de/translatable_strings.xml | 0 .../src/main/res/values-es/translatable_strings.xml | 0 .../src/main/res/values-fr/translatable_strings.xml | 0 .../src/main/res/values-ja/translatable_strings.xml | 0 .../src/main/res/values-lt/translatable_strings.xml | 0 .../src/main/res/values-nb/translatable_strings.xml | 0 .../src/main/res/values-nl/translatable_strings.xml | 0 .../src/main/res/values-pl/translatable_strings.xml | 0 .../src/main/res/values-ru/translatable_strings.xml | 0 .../src/main/res/values-sq/translatable_strings.xml | 0 .../src/main/res/values-sv/translatable_strings.xml | 0 .../src/main/res/values-uk/translatable_strings.xml | 0 .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/attrs_credits_roll_view.xml | 0 {app => AIMSICD}/src/main/res/values/colors.xml | 0 {app => AIMSICD}/src/main/res/values/config.xml | 0 {app => AIMSICD}/src/main/res/values/dimens.xml | 0 {app => AIMSICD}/src/main/res/values/styles.xml | 0 {app => AIMSICD}/src/main/res/values/themes.xml | 0 .../src/main/res/values/translatable_strings.xml | 0 .../src/main/res/values/untranslatable_strings.xml | 0 .../src/main/res/xml/map_preferences.xml | 0 {app => AIMSICD}/src/main/res/xml/pbar.xml | 0 {app => AIMSICD}/src/main/res/xml/preferences.xml | 0 {app => AIMSICD}/src/system/AndroidManifest.xml | 0 settings.gradle | 2 +- 363 files changed, 1 insertion(+), 1 deletion(-) rename {app => AIMSICD}/.gitignore (100%) rename {app => AIMSICD}/build.gradle (100%) rename {app => AIMSICD}/proguard-rules.txt (100%) rename {app => AIMSICD}/src/androidTest/java/com/SecUpwN/AIMSICD/test/Detection1.java (100%) rename {app => AIMSICD}/src/androidTest/java/com/SecUpwN/AIMSICD/test/GetProp.java (100%) rename {app => AIMSICD}/src/main/AndroidManifest.xml (100%) rename {app => AIMSICD}/src/main/assets/CREDITS (100%) rename {app => AIMSICD}/src/main/assets/CreateDBe_import.sql (100%) rename {app => AIMSICD}/src/main/assets/aimsicd.db (100%) rename {app => AIMSICD}/src/main/assets/aimsicd.sql (100%) rename {app => AIMSICD}/src/main/assets/default_mcc_locations.csv (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/MapPrefActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/activities/PrefActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/BaseInflaterAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureItemData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/CardItemData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/CellCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/DbViewerSpinnerAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportItemData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/DefaultLocationCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/DetailsPagerAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/DrawerMenuAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogItemData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/Holders/ViewTableNameSpinnerHolder.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/IAdapterViewInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/OpenCellIdCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsItemData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/constants/DBTableColumnIds.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/constants/DrawerMenu.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/constants/Examples.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/constants/TinyDbKeys.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuActivityConfiguration.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuItem.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuSection.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/drawer/NavDrawerItem.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/enums/StatesDbViewer.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/CellInfoFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/CreditsRollView.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/DetailsContainerFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/MapPrefFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/fragments/PrefFragment.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerGridMarkerClusterer.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerMarker.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/map/MarkerData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/DetectResult.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/HexDump.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/OemRilExecutor.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RawResult.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/StringsResult.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/service/AccelerometerMonitor.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseSmsAdapter.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserItems.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsCardInflater.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsData.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/AsyncResponse.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/BaseAsyncTask.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/GeoLocation.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/Icon.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/LocationServices.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/OCIDCSV.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/StackOverflowXmlParser.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/Status.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/TinyDB.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/widget/HighlightTextView.java (100%) rename {app => AIMSICD}/src/main/java/com/SecUpwN/AIMSICD/widget/ScaledTransitionHandler.java (100%) rename {app => AIMSICD}/src/main/res/anim/action_button_help.xml (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/cell_tower.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/flat_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/flat_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/flat_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/flat_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/flat_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/flat_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_about.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_computer.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_download.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_import_export.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_location_found.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_location_off.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_map.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_network_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_network_cell_not_tracked.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_phone.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_remove.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_send_logs.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_settings.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_action_storage.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_drawer.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_map_pin_blue.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_map_pin_green.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_map_pin_orange.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/ic_map_pin_red.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/sense_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/sense_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/sense_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/sense_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/sense_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/sense_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/stat_sys_download_anim0.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/stat_sys_upload_anim0.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/track_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/untrack_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/vp_background_texture.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/white_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/white_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/white_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/white_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/white_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-hdpi/white_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/cell_tower.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/flat_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/flat_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/flat_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/flat_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/flat_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/flat_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/ic_action_download.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/ic_action_location_off.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/ic_action_network_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/ic_action_network_cell_not_tracked.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/sense_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/sense_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/sense_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/sense_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/sense_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/sense_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/stat_sys_download_anim0.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/stat_sys_upload_anim0.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/track_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/untrack_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/white_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/white_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/white_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/white_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/white_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-ldpi/white_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/cell_tower.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/flat_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/flat_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/flat_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/flat_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/flat_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/flat_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_about.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_computer.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_download.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_import_export.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_location_found.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_location_off.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_map.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_network_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_network_cell_not_tracked.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_phone.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_remove.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_send_logs.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_settings.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_action_storage.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_drawer.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_map_pin_blue.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_map_pin_green.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_map_pin_orange.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/ic_map_pin_red.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/sense_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/sense_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/sense_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/sense_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/sense_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/sense_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/stat_sys_download_anim0.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/stat_sys_upload_anim0.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/track_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/untrack_cell.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/vp_background_texture.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/white_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/white_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/white_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/white_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/white_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-mdpi/white_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/flat_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/flat_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/flat_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/flat_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/flat_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/flat_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/ic_action_send_logs.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/ic_map_pin_blue.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/ic_map_pin_green.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/ic_map_pin_orange.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/ic_map_pin_red.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/sense_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/sense_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/sense_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/sense_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/sense_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/sense_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/white_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/white_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/white_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/white_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/white_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xhdpi/white_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/flat_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/flat_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/flat_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/flat_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/flat_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/flat_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/ic_action_send_logs.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/ic_map_pin_blue.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/ic_map_pin_green.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/ic_map_pin_orange.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/ic_map_pin_red.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/sense_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/sense_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/sense_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/sense_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/sense_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/sense_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/white_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/white_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/white_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/white_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/white_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxhdpi/white_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/flat_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/flat_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/flat_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/flat_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/flat_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/flat_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/ic_action_delete_database.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/ic_info.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/sense_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/sense_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/sense_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/sense_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/sense_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/sense_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/white_danger.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/white_high.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/white_idle.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/white_medium.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/white_ok.png (100%) rename {app => AIMSICD}/src/main/res/drawable-xxxhdpi/white_skull.png (100%) rename {app => AIMSICD}/src/main/res/drawable/empty_icon.xml (100%) rename {app => AIMSICD}/src/main/res/drawable/layer_card_background.xml (100%) rename {app => AIMSICD}/src/main/res/drawable/layer_card_background_selected.xml (100%) rename {app => AIMSICD}/src/main/res/drawable/pager_background.xml (100%) rename {app => AIMSICD}/src/main/res/drawable/progress_bar_states.xml (100%) rename {app => AIMSICD}/src/main/res/drawable/selector_card_background.xml (100%) rename {app => AIMSICD}/src/main/res/layout/about_fragment.xml (100%) rename {app => AIMSICD}/src/main/res/layout/actionbar_indeterminate_progress.xml (100%) rename {app => AIMSICD}/src/main/res/layout/activity_advanced_sms_user.xml (100%) rename {app => AIMSICD}/src/main/res/layout/activity_advanced_user.xml (100%) rename {app => AIMSICD}/src/main/res/layout/activity_debug_logs.xml (100%) rename {app => AIMSICD}/src/main/res/layout/activity_open_cell_id.xml (100%) rename {app => AIMSICD}/src/main/res/layout/adv_user_sms_listview.xml (100%) rename {app => AIMSICD}/src/main/res/layout/adv_user_strings_list.xml (100%) rename {app => AIMSICD}/src/main/res/layout/at_command_fragment.xml (100%) rename {app => AIMSICD}/src/main/res/layout/bonuspack_bubble.xml (100%) rename {app => AIMSICD}/src/main/res/layout/bts_measure_data.xml (100%) rename {app => AIMSICD}/src/main/res/layout/cell_fragment.xml (100%) rename {app => AIMSICD}/src/main/res/layout/cell_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/creditroll.xml (100%) rename {app => AIMSICD}/src/main/res/layout/db_view.xml (100%) rename {app => AIMSICD}/src/main/res/layout/dbe_import_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/default_location_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/detection_sms_db_listview.xml (100%) rename {app => AIMSICD}/src/main/res/layout/detection_strings_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/device.xml (100%) rename {app => AIMSICD}/src/main/res/layout/drawer_item.xml (100%) rename {app => AIMSICD}/src/main/res/layout/drawer_section.xml (100%) rename {app => AIMSICD}/src/main/res/layout/eventlog_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/fragment_details_container.xml (100%) rename {app => AIMSICD}/src/main/res/layout/inc_buttonbar_divider.xml (100%) rename {app => AIMSICD}/src/main/res/layout/item_spinner_db_viewer.xml (100%) rename {app => AIMSICD}/src/main/res/layout/main.xml (100%) rename {app => AIMSICD}/src/main/res/layout/map.xml (100%) rename {app => AIMSICD}/src/main/res/layout/marker_info_window.xml (100%) rename {app => AIMSICD}/src/main/res/layout/measured_signal_str.xml (100%) rename {app => AIMSICD}/src/main/res/layout/opencelid_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/silent_sms_items.xml (100%) rename {app => AIMSICD}/src/main/res/layout/unique_bts_data.xml (100%) rename {app => AIMSICD}/src/main/res/menu/activity_debug_logs.xml (100%) rename {app => AIMSICD}/src/main/res/menu/map_viewer_menu.xml (100%) rename {app => AIMSICD}/src/main/res/values-cs/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-de/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-es/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-fr/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-ja/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-lt/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-nb/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-nl/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-pl/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-ru/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-sq/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-sv/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-uk/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values-w820dp/dimens.xml (100%) rename {app => AIMSICD}/src/main/res/values/attrs_credits_roll_view.xml (100%) rename {app => AIMSICD}/src/main/res/values/colors.xml (100%) rename {app => AIMSICD}/src/main/res/values/config.xml (100%) rename {app => AIMSICD}/src/main/res/values/dimens.xml (100%) rename {app => AIMSICD}/src/main/res/values/styles.xml (100%) rename {app => AIMSICD}/src/main/res/values/themes.xml (100%) rename {app => AIMSICD}/src/main/res/values/translatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/values/untranslatable_strings.xml (100%) rename {app => AIMSICD}/src/main/res/xml/map_preferences.xml (100%) rename {app => AIMSICD}/src/main/res/xml/pbar.xml (100%) rename {app => AIMSICD}/src/main/res/xml/preferences.xml (100%) rename {app => AIMSICD}/src/system/AndroidManifest.xml (100%) diff --git a/app/.gitignore b/AIMSICD/.gitignore similarity index 100% rename from app/.gitignore rename to AIMSICD/.gitignore diff --git a/app/build.gradle b/AIMSICD/build.gradle similarity index 100% rename from app/build.gradle rename to AIMSICD/build.gradle diff --git a/app/proguard-rules.txt b/AIMSICD/proguard-rules.txt similarity index 100% rename from app/proguard-rules.txt rename to AIMSICD/proguard-rules.txt diff --git a/app/src/androidTest/java/com/SecUpwN/AIMSICD/test/Detection1.java b/AIMSICD/src/androidTest/java/com/SecUpwN/AIMSICD/test/Detection1.java similarity index 100% rename from app/src/androidTest/java/com/SecUpwN/AIMSICD/test/Detection1.java rename to AIMSICD/src/androidTest/java/com/SecUpwN/AIMSICD/test/Detection1.java diff --git a/app/src/androidTest/java/com/SecUpwN/AIMSICD/test/GetProp.java b/AIMSICD/src/androidTest/java/com/SecUpwN/AIMSICD/test/GetProp.java similarity index 100% rename from app/src/androidTest/java/com/SecUpwN/AIMSICD/test/GetProp.java rename to AIMSICD/src/androidTest/java/com/SecUpwN/AIMSICD/test/GetProp.java diff --git a/app/src/main/AndroidManifest.xml b/AIMSICD/src/main/AndroidManifest.xml similarity index 100% rename from app/src/main/AndroidManifest.xml rename to AIMSICD/src/main/AndroidManifest.xml diff --git a/app/src/main/assets/CREDITS b/AIMSICD/src/main/assets/CREDITS similarity index 100% rename from app/src/main/assets/CREDITS rename to AIMSICD/src/main/assets/CREDITS diff --git a/app/src/main/assets/CreateDBe_import.sql b/AIMSICD/src/main/assets/CreateDBe_import.sql similarity index 100% rename from app/src/main/assets/CreateDBe_import.sql rename to AIMSICD/src/main/assets/CreateDBe_import.sql diff --git a/app/src/main/assets/aimsicd.db b/AIMSICD/src/main/assets/aimsicd.db similarity index 100% rename from app/src/main/assets/aimsicd.db rename to AIMSICD/src/main/assets/aimsicd.db diff --git a/app/src/main/assets/aimsicd.sql b/AIMSICD/src/main/assets/aimsicd.sql similarity index 100% rename from app/src/main/assets/aimsicd.sql rename to AIMSICD/src/main/assets/aimsicd.sql diff --git a/app/src/main/assets/default_mcc_locations.csv b/AIMSICD/src/main/assets/default_mcc_locations.csv similarity index 100% rename from app/src/main/assets/default_mcc_locations.csv rename to AIMSICD/src/main/assets/default_mcc_locations.csv diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/AIMSICD.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/AppAIMSICD.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/BaseActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/CreditsRollActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/DebugLogs.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapPrefActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/MapPrefActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/MapPrefActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/MapPrefActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/MapViewerOsmDroid.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/OpenCellIdActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/activities/PrefActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/PrefActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/activities/PrefActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/activities/PrefActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/AIMSICDDbAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/BaseInflaterAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/BaseInflaterAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/BaseInflaterAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/BaseInflaterAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureItemData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureItemData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureItemData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/BtsMeasureItemData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/CardItemData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/CardItemData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/CardItemData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/CardItemData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/CellCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/CellCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/CellCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/CellCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/DbViewerSpinnerAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DbViewerSpinnerAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/DbViewerSpinnerAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DbViewerSpinnerAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportItemData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportItemData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportItemData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DbeImportItemData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/DefaultLocationCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DefaultLocationCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/DefaultLocationCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DefaultLocationCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/DetailsPagerAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DetailsPagerAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/DetailsPagerAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DetailsPagerAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/DrawerMenuAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DrawerMenuAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/DrawerMenuAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/DrawerMenuAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogItemData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogItemData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogItemData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/EventLogItemData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/Holders/ViewTableNameSpinnerHolder.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/Holders/ViewTableNameSpinnerHolder.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/Holders/ViewTableNameSpinnerHolder.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/Holders/ViewTableNameSpinnerHolder.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/IAdapterViewInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/IAdapterViewInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/IAdapterViewInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/IAdapterViewInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/MeasuredCellStrengthCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/OpenCellIdCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/OpenCellIdCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/OpenCellIdCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/OpenCellIdCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/SilentSmsCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsItemData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsItemData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsItemData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/adapters/UniqueBtsItemData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/constants/DBTableColumnIds.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/DBTableColumnIds.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/constants/DBTableColumnIds.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/DBTableColumnIds.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/constants/DrawerMenu.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/DrawerMenu.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/constants/DrawerMenu.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/DrawerMenu.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/constants/Examples.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/Examples.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/constants/Examples.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/Examples.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/constants/TinyDbKeys.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/TinyDbKeys.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/constants/TinyDbKeys.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/constants/TinyDbKeys.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuActivityConfiguration.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuActivityConfiguration.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuActivityConfiguration.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuActivityConfiguration.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuItem.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuItem.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuItem.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuItem.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuSection.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuSection.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuSection.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/DrawerMenuSection.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/drawer/NavDrawerItem.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/NavDrawerItem.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/drawer/NavDrawerItem.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/drawer/NavDrawerItem.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/enums/StatesDbViewer.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/enums/StatesDbViewer.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/enums/StatesDbViewer.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/enums/StatesDbViewer.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/AboutFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/AtCommandFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/CellInfoFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/CellInfoFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/CellInfoFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/CellInfoFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/CreditsRollView.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/CreditsRollView.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/CreditsRollView.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/CreditsRollView.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/DbViewerFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DetailsContainerFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/DetailsContainerFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/DetailsContainerFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/DetailsContainerFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/DeviceFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/MapPrefFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/MapPrefFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/MapPrefFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/MapPrefFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/fragments/PrefFragment.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/PrefFragment.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/fragments/PrefFragment.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/fragments/PrefFragment.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerGridMarkerClusterer.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerGridMarkerClusterer.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerGridMarkerClusterer.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerGridMarkerClusterer.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerMarker.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerMarker.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerMarker.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/map/CellTowerMarker.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/map/MarkerData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/map/MarkerData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/map/MarkerData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/map/MarkerData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/receiver/BootCompletedReceiver.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/DetectResult.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/DetectResult.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/DetectResult.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/DetectResult.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/HexDump.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/HexDump.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/HexDump.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/HexDump.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/OemRilExecutor.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/OemRilExecutor.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/OemRilExecutor.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/OemRilExecutor.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RawResult.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RawResult.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RawResult.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RawResult.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/RilExecutor.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/SamsungMulticlientRilExecutor.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/StringsResult.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/StringsResult.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/StringsResult.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/rilexecutor/StringsResult.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/AccelerometerMonitor.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/AccelerometerMonitor.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/service/AccelerometerMonitor.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/AccelerometerMonitor.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/AimsicdService.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/CellTracker.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/LocationTracker.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/service/SignalStrengthTracker.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseSmsAdapter.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseSmsAdapter.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseSmsAdapter.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserBaseSmsAdapter.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserItems.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserItems.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserItems.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvanceUserItems.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/AdvancedUserSmsActivity.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/CapturedSmsData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsCardInflater.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsCardInflater.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsCardInflater.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsCardInflater.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsData.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsData.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsData.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/DetectionStringsData.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/smsdetection/SmsDetector.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/AsyncResponse.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/AsyncResponse.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/AsyncResponse.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/AsyncResponse.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/BaseAsyncTask.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/BaseAsyncTask.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/BaseAsyncTask.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/BaseAsyncTask.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/CMDProcessor.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Cell.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/ChildProcess.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/CommandResult.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Device.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi17.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/DeviceApi18.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/GeoLocation.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/GeoLocation.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/GeoLocation.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/GeoLocation.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Helpers.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Icon.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Icon.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/Icon.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Icon.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/LocationServices.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/LocationServices.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/LocationServices.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/LocationServices.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/MiscUtils.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/OCIDCSV.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/OCIDCSV.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/OCIDCSV.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/OCIDCSV.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/OemCommands.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/RequestTask.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/StackOverflowXmlParser.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/StackOverflowXmlParser.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/StackOverflowXmlParser.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/StackOverflowXmlParser.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Status.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Status.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/Status.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Status.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/SystemPropertiesReflection.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/TinyDB.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/TinyDB.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/TinyDB.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/TinyDB.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/Toaster.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/TruncatedLocation.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/AtCommandTerminal.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyPrivFile.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/utils/atcmd/TtyStream.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/widget/HighlightTextView.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/widget/HighlightTextView.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/widget/HighlightTextView.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/widget/HighlightTextView.java diff --git a/app/src/main/java/com/SecUpwN/AIMSICD/widget/ScaledTransitionHandler.java b/AIMSICD/src/main/java/com/SecUpwN/AIMSICD/widget/ScaledTransitionHandler.java similarity index 100% rename from app/src/main/java/com/SecUpwN/AIMSICD/widget/ScaledTransitionHandler.java rename to AIMSICD/src/main/java/com/SecUpwN/AIMSICD/widget/ScaledTransitionHandler.java diff --git a/app/src/main/res/anim/action_button_help.xml b/AIMSICD/src/main/res/anim/action_button_help.xml similarity index 100% rename from app/src/main/res/anim/action_button_help.xml rename to AIMSICD/src/main/res/anim/action_button_help.xml diff --git a/app/src/main/res/drawable-hdpi/cell_tower.png b/AIMSICD/src/main/res/drawable-hdpi/cell_tower.png similarity index 100% rename from app/src/main/res/drawable-hdpi/cell_tower.png rename to AIMSICD/src/main/res/drawable-hdpi/cell_tower.png diff --git a/app/src/main/res/drawable-hdpi/flat_danger.png b/AIMSICD/src/main/res/drawable-hdpi/flat_danger.png similarity index 100% rename from app/src/main/res/drawable-hdpi/flat_danger.png rename to AIMSICD/src/main/res/drawable-hdpi/flat_danger.png diff --git a/app/src/main/res/drawable-hdpi/flat_high.png b/AIMSICD/src/main/res/drawable-hdpi/flat_high.png similarity index 100% rename from app/src/main/res/drawable-hdpi/flat_high.png rename to AIMSICD/src/main/res/drawable-hdpi/flat_high.png diff --git a/app/src/main/res/drawable-hdpi/flat_idle.png b/AIMSICD/src/main/res/drawable-hdpi/flat_idle.png similarity index 100% rename from app/src/main/res/drawable-hdpi/flat_idle.png rename to AIMSICD/src/main/res/drawable-hdpi/flat_idle.png diff --git a/app/src/main/res/drawable-hdpi/flat_medium.png b/AIMSICD/src/main/res/drawable-hdpi/flat_medium.png similarity index 100% rename from app/src/main/res/drawable-hdpi/flat_medium.png rename to AIMSICD/src/main/res/drawable-hdpi/flat_medium.png diff --git a/app/src/main/res/drawable-hdpi/flat_ok.png b/AIMSICD/src/main/res/drawable-hdpi/flat_ok.png similarity index 100% rename from app/src/main/res/drawable-hdpi/flat_ok.png rename to AIMSICD/src/main/res/drawable-hdpi/flat_ok.png diff --git a/app/src/main/res/drawable-hdpi/flat_skull.png b/AIMSICD/src/main/res/drawable-hdpi/flat_skull.png similarity index 100% rename from app/src/main/res/drawable-hdpi/flat_skull.png rename to AIMSICD/src/main/res/drawable-hdpi/flat_skull.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_about.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_about.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_about.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_about.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_computer.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_computer.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_computer.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_computer.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_download.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_download.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_download.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_download.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_import_export.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_import_export.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_import_export.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_import_export.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_location_found.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_location_found.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_location_found.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_location_found.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_location_off.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_location_off.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_location_off.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_location_off.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_map.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_map.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_map.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_map.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_network_cell.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_network_cell.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_network_cell.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_network_cell.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_network_cell_not_tracked.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_network_cell_not_tracked.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_network_cell_not_tracked.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_network_cell_not_tracked.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_phone.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_phone.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_phone.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_phone.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_remove.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_remove.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_remove.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_remove.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_send_logs.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_send_logs.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_send_logs.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_send_logs.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_settings.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_settings.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_settings.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_settings.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_storage.png b/AIMSICD/src/main/res/drawable-hdpi/ic_action_storage.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_storage.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_action_storage.png diff --git a/app/src/main/res/drawable-hdpi/ic_drawer.png b/AIMSICD/src/main/res/drawable-hdpi/ic_drawer.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_drawer.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_drawer.png diff --git a/app/src/main/res/drawable-hdpi/ic_map_pin_blue.png b/AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_blue.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_map_pin_blue.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_blue.png diff --git a/app/src/main/res/drawable-hdpi/ic_map_pin_green.png b/AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_green.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_map_pin_green.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_green.png diff --git a/app/src/main/res/drawable-hdpi/ic_map_pin_orange.png b/AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_orange.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_map_pin_orange.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_orange.png diff --git a/app/src/main/res/drawable-hdpi/ic_map_pin_red.png b/AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_red.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_map_pin_red.png rename to AIMSICD/src/main/res/drawable-hdpi/ic_map_pin_red.png diff --git a/app/src/main/res/drawable-hdpi/sense_danger.png b/AIMSICD/src/main/res/drawable-hdpi/sense_danger.png similarity index 100% rename from app/src/main/res/drawable-hdpi/sense_danger.png rename to AIMSICD/src/main/res/drawable-hdpi/sense_danger.png diff --git a/app/src/main/res/drawable-hdpi/sense_high.png b/AIMSICD/src/main/res/drawable-hdpi/sense_high.png similarity index 100% rename from app/src/main/res/drawable-hdpi/sense_high.png rename to AIMSICD/src/main/res/drawable-hdpi/sense_high.png diff --git a/app/src/main/res/drawable-hdpi/sense_idle.png b/AIMSICD/src/main/res/drawable-hdpi/sense_idle.png similarity index 100% rename from app/src/main/res/drawable-hdpi/sense_idle.png rename to AIMSICD/src/main/res/drawable-hdpi/sense_idle.png diff --git a/app/src/main/res/drawable-hdpi/sense_medium.png b/AIMSICD/src/main/res/drawable-hdpi/sense_medium.png similarity index 100% rename from app/src/main/res/drawable-hdpi/sense_medium.png rename to AIMSICD/src/main/res/drawable-hdpi/sense_medium.png diff --git a/app/src/main/res/drawable-hdpi/sense_ok.png b/AIMSICD/src/main/res/drawable-hdpi/sense_ok.png similarity index 100% rename from app/src/main/res/drawable-hdpi/sense_ok.png rename to AIMSICD/src/main/res/drawable-hdpi/sense_ok.png diff --git a/app/src/main/res/drawable-hdpi/sense_skull.png b/AIMSICD/src/main/res/drawable-hdpi/sense_skull.png similarity index 100% rename from app/src/main/res/drawable-hdpi/sense_skull.png rename to AIMSICD/src/main/res/drawable-hdpi/sense_skull.png diff --git a/app/src/main/res/drawable-hdpi/stat_sys_download_anim0.png b/AIMSICD/src/main/res/drawable-hdpi/stat_sys_download_anim0.png similarity index 100% rename from app/src/main/res/drawable-hdpi/stat_sys_download_anim0.png rename to AIMSICD/src/main/res/drawable-hdpi/stat_sys_download_anim0.png diff --git a/app/src/main/res/drawable-hdpi/stat_sys_upload_anim0.png b/AIMSICD/src/main/res/drawable-hdpi/stat_sys_upload_anim0.png similarity index 100% rename from app/src/main/res/drawable-hdpi/stat_sys_upload_anim0.png rename to AIMSICD/src/main/res/drawable-hdpi/stat_sys_upload_anim0.png diff --git a/app/src/main/res/drawable-hdpi/track_cell.png b/AIMSICD/src/main/res/drawable-hdpi/track_cell.png similarity index 100% rename from app/src/main/res/drawable-hdpi/track_cell.png rename to AIMSICD/src/main/res/drawable-hdpi/track_cell.png diff --git a/app/src/main/res/drawable-hdpi/untrack_cell.png b/AIMSICD/src/main/res/drawable-hdpi/untrack_cell.png similarity index 100% rename from app/src/main/res/drawable-hdpi/untrack_cell.png rename to AIMSICD/src/main/res/drawable-hdpi/untrack_cell.png diff --git a/app/src/main/res/drawable-hdpi/vp_background_texture.png b/AIMSICD/src/main/res/drawable-hdpi/vp_background_texture.png similarity index 100% rename from app/src/main/res/drawable-hdpi/vp_background_texture.png rename to AIMSICD/src/main/res/drawable-hdpi/vp_background_texture.png diff --git a/app/src/main/res/drawable-hdpi/white_danger.png b/AIMSICD/src/main/res/drawable-hdpi/white_danger.png similarity index 100% rename from app/src/main/res/drawable-hdpi/white_danger.png rename to AIMSICD/src/main/res/drawable-hdpi/white_danger.png diff --git a/app/src/main/res/drawable-hdpi/white_high.png b/AIMSICD/src/main/res/drawable-hdpi/white_high.png similarity index 100% rename from app/src/main/res/drawable-hdpi/white_high.png rename to AIMSICD/src/main/res/drawable-hdpi/white_high.png diff --git a/app/src/main/res/drawable-hdpi/white_idle.png b/AIMSICD/src/main/res/drawable-hdpi/white_idle.png similarity index 100% rename from app/src/main/res/drawable-hdpi/white_idle.png rename to AIMSICD/src/main/res/drawable-hdpi/white_idle.png diff --git a/app/src/main/res/drawable-hdpi/white_medium.png b/AIMSICD/src/main/res/drawable-hdpi/white_medium.png similarity index 100% rename from app/src/main/res/drawable-hdpi/white_medium.png rename to AIMSICD/src/main/res/drawable-hdpi/white_medium.png diff --git a/app/src/main/res/drawable-hdpi/white_ok.png b/AIMSICD/src/main/res/drawable-hdpi/white_ok.png similarity index 100% rename from app/src/main/res/drawable-hdpi/white_ok.png rename to AIMSICD/src/main/res/drawable-hdpi/white_ok.png diff --git a/app/src/main/res/drawable-hdpi/white_skull.png b/AIMSICD/src/main/res/drawable-hdpi/white_skull.png similarity index 100% rename from app/src/main/res/drawable-hdpi/white_skull.png rename to AIMSICD/src/main/res/drawable-hdpi/white_skull.png diff --git a/app/src/main/res/drawable-ldpi/cell_tower.png b/AIMSICD/src/main/res/drawable-ldpi/cell_tower.png similarity index 100% rename from app/src/main/res/drawable-ldpi/cell_tower.png rename to AIMSICD/src/main/res/drawable-ldpi/cell_tower.png diff --git a/app/src/main/res/drawable-ldpi/flat_danger.png b/AIMSICD/src/main/res/drawable-ldpi/flat_danger.png similarity index 100% rename from app/src/main/res/drawable-ldpi/flat_danger.png rename to AIMSICD/src/main/res/drawable-ldpi/flat_danger.png diff --git a/app/src/main/res/drawable-ldpi/flat_high.png b/AIMSICD/src/main/res/drawable-ldpi/flat_high.png similarity index 100% rename from app/src/main/res/drawable-ldpi/flat_high.png rename to AIMSICD/src/main/res/drawable-ldpi/flat_high.png diff --git a/app/src/main/res/drawable-ldpi/flat_idle.png b/AIMSICD/src/main/res/drawable-ldpi/flat_idle.png similarity index 100% rename from app/src/main/res/drawable-ldpi/flat_idle.png rename to AIMSICD/src/main/res/drawable-ldpi/flat_idle.png diff --git a/app/src/main/res/drawable-ldpi/flat_medium.png b/AIMSICD/src/main/res/drawable-ldpi/flat_medium.png similarity index 100% rename from app/src/main/res/drawable-ldpi/flat_medium.png rename to AIMSICD/src/main/res/drawable-ldpi/flat_medium.png diff --git a/app/src/main/res/drawable-ldpi/flat_ok.png b/AIMSICD/src/main/res/drawable-ldpi/flat_ok.png similarity index 100% rename from app/src/main/res/drawable-ldpi/flat_ok.png rename to AIMSICD/src/main/res/drawable-ldpi/flat_ok.png diff --git a/app/src/main/res/drawable-ldpi/flat_skull.png b/AIMSICD/src/main/res/drawable-ldpi/flat_skull.png similarity index 100% rename from app/src/main/res/drawable-ldpi/flat_skull.png rename to AIMSICD/src/main/res/drawable-ldpi/flat_skull.png diff --git a/app/src/main/res/drawable-ldpi/ic_action_download.png b/AIMSICD/src/main/res/drawable-ldpi/ic_action_download.png similarity index 100% rename from app/src/main/res/drawable-ldpi/ic_action_download.png rename to AIMSICD/src/main/res/drawable-ldpi/ic_action_download.png diff --git a/app/src/main/res/drawable-ldpi/ic_action_location_off.png b/AIMSICD/src/main/res/drawable-ldpi/ic_action_location_off.png similarity index 100% rename from app/src/main/res/drawable-ldpi/ic_action_location_off.png rename to AIMSICD/src/main/res/drawable-ldpi/ic_action_location_off.png diff --git a/app/src/main/res/drawable-ldpi/ic_action_network_cell.png b/AIMSICD/src/main/res/drawable-ldpi/ic_action_network_cell.png similarity index 100% rename from app/src/main/res/drawable-ldpi/ic_action_network_cell.png rename to AIMSICD/src/main/res/drawable-ldpi/ic_action_network_cell.png diff --git a/app/src/main/res/drawable-ldpi/ic_action_network_cell_not_tracked.png b/AIMSICD/src/main/res/drawable-ldpi/ic_action_network_cell_not_tracked.png similarity index 100% rename from app/src/main/res/drawable-ldpi/ic_action_network_cell_not_tracked.png rename to AIMSICD/src/main/res/drawable-ldpi/ic_action_network_cell_not_tracked.png diff --git a/app/src/main/res/drawable-ldpi/sense_danger.png b/AIMSICD/src/main/res/drawable-ldpi/sense_danger.png similarity index 100% rename from app/src/main/res/drawable-ldpi/sense_danger.png rename to AIMSICD/src/main/res/drawable-ldpi/sense_danger.png diff --git a/app/src/main/res/drawable-ldpi/sense_high.png b/AIMSICD/src/main/res/drawable-ldpi/sense_high.png similarity index 100% rename from app/src/main/res/drawable-ldpi/sense_high.png rename to AIMSICD/src/main/res/drawable-ldpi/sense_high.png diff --git a/app/src/main/res/drawable-ldpi/sense_idle.png b/AIMSICD/src/main/res/drawable-ldpi/sense_idle.png similarity index 100% rename from app/src/main/res/drawable-ldpi/sense_idle.png rename to AIMSICD/src/main/res/drawable-ldpi/sense_idle.png diff --git a/app/src/main/res/drawable-ldpi/sense_medium.png b/AIMSICD/src/main/res/drawable-ldpi/sense_medium.png similarity index 100% rename from app/src/main/res/drawable-ldpi/sense_medium.png rename to AIMSICD/src/main/res/drawable-ldpi/sense_medium.png diff --git a/app/src/main/res/drawable-ldpi/sense_ok.png b/AIMSICD/src/main/res/drawable-ldpi/sense_ok.png similarity index 100% rename from app/src/main/res/drawable-ldpi/sense_ok.png rename to AIMSICD/src/main/res/drawable-ldpi/sense_ok.png diff --git a/app/src/main/res/drawable-ldpi/sense_skull.png b/AIMSICD/src/main/res/drawable-ldpi/sense_skull.png similarity index 100% rename from app/src/main/res/drawable-ldpi/sense_skull.png rename to AIMSICD/src/main/res/drawable-ldpi/sense_skull.png diff --git a/app/src/main/res/drawable-ldpi/stat_sys_download_anim0.png b/AIMSICD/src/main/res/drawable-ldpi/stat_sys_download_anim0.png similarity index 100% rename from app/src/main/res/drawable-ldpi/stat_sys_download_anim0.png rename to AIMSICD/src/main/res/drawable-ldpi/stat_sys_download_anim0.png diff --git a/app/src/main/res/drawable-ldpi/stat_sys_upload_anim0.png b/AIMSICD/src/main/res/drawable-ldpi/stat_sys_upload_anim0.png similarity index 100% rename from app/src/main/res/drawable-ldpi/stat_sys_upload_anim0.png rename to AIMSICD/src/main/res/drawable-ldpi/stat_sys_upload_anim0.png diff --git a/app/src/main/res/drawable-ldpi/track_cell.png b/AIMSICD/src/main/res/drawable-ldpi/track_cell.png similarity index 100% rename from app/src/main/res/drawable-ldpi/track_cell.png rename to AIMSICD/src/main/res/drawable-ldpi/track_cell.png diff --git a/app/src/main/res/drawable-ldpi/untrack_cell.png b/AIMSICD/src/main/res/drawable-ldpi/untrack_cell.png similarity index 100% rename from app/src/main/res/drawable-ldpi/untrack_cell.png rename to AIMSICD/src/main/res/drawable-ldpi/untrack_cell.png diff --git a/app/src/main/res/drawable-ldpi/white_danger.png b/AIMSICD/src/main/res/drawable-ldpi/white_danger.png similarity index 100% rename from app/src/main/res/drawable-ldpi/white_danger.png rename to AIMSICD/src/main/res/drawable-ldpi/white_danger.png diff --git a/app/src/main/res/drawable-ldpi/white_high.png b/AIMSICD/src/main/res/drawable-ldpi/white_high.png similarity index 100% rename from app/src/main/res/drawable-ldpi/white_high.png rename to AIMSICD/src/main/res/drawable-ldpi/white_high.png diff --git a/app/src/main/res/drawable-ldpi/white_idle.png b/AIMSICD/src/main/res/drawable-ldpi/white_idle.png similarity index 100% rename from app/src/main/res/drawable-ldpi/white_idle.png rename to AIMSICD/src/main/res/drawable-ldpi/white_idle.png diff --git a/app/src/main/res/drawable-ldpi/white_medium.png b/AIMSICD/src/main/res/drawable-ldpi/white_medium.png similarity index 100% rename from app/src/main/res/drawable-ldpi/white_medium.png rename to AIMSICD/src/main/res/drawable-ldpi/white_medium.png diff --git a/app/src/main/res/drawable-ldpi/white_ok.png b/AIMSICD/src/main/res/drawable-ldpi/white_ok.png similarity index 100% rename from app/src/main/res/drawable-ldpi/white_ok.png rename to AIMSICD/src/main/res/drawable-ldpi/white_ok.png diff --git a/app/src/main/res/drawable-ldpi/white_skull.png b/AIMSICD/src/main/res/drawable-ldpi/white_skull.png similarity index 100% rename from app/src/main/res/drawable-ldpi/white_skull.png rename to AIMSICD/src/main/res/drawable-ldpi/white_skull.png diff --git a/app/src/main/res/drawable-mdpi/cell_tower.png b/AIMSICD/src/main/res/drawable-mdpi/cell_tower.png similarity index 100% rename from app/src/main/res/drawable-mdpi/cell_tower.png rename to AIMSICD/src/main/res/drawable-mdpi/cell_tower.png diff --git a/app/src/main/res/drawable-mdpi/flat_danger.png b/AIMSICD/src/main/res/drawable-mdpi/flat_danger.png similarity index 100% rename from app/src/main/res/drawable-mdpi/flat_danger.png rename to AIMSICD/src/main/res/drawable-mdpi/flat_danger.png diff --git a/app/src/main/res/drawable-mdpi/flat_high.png b/AIMSICD/src/main/res/drawable-mdpi/flat_high.png similarity index 100% rename from app/src/main/res/drawable-mdpi/flat_high.png rename to AIMSICD/src/main/res/drawable-mdpi/flat_high.png diff --git a/app/src/main/res/drawable-mdpi/flat_idle.png b/AIMSICD/src/main/res/drawable-mdpi/flat_idle.png similarity index 100% rename from app/src/main/res/drawable-mdpi/flat_idle.png rename to AIMSICD/src/main/res/drawable-mdpi/flat_idle.png diff --git a/app/src/main/res/drawable-mdpi/flat_medium.png b/AIMSICD/src/main/res/drawable-mdpi/flat_medium.png similarity index 100% rename from app/src/main/res/drawable-mdpi/flat_medium.png rename to AIMSICD/src/main/res/drawable-mdpi/flat_medium.png diff --git a/app/src/main/res/drawable-mdpi/flat_ok.png b/AIMSICD/src/main/res/drawable-mdpi/flat_ok.png similarity index 100% rename from app/src/main/res/drawable-mdpi/flat_ok.png rename to AIMSICD/src/main/res/drawable-mdpi/flat_ok.png diff --git a/app/src/main/res/drawable-mdpi/flat_skull.png b/AIMSICD/src/main/res/drawable-mdpi/flat_skull.png similarity index 100% rename from app/src/main/res/drawable-mdpi/flat_skull.png rename to AIMSICD/src/main/res/drawable-mdpi/flat_skull.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_about.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_about.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_about.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_about.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_computer.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_computer.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_computer.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_computer.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_download.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_download.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_download.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_download.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_import_export.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_import_export.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_import_export.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_import_export.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_location_found.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_location_found.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_location_found.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_location_found.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_location_off.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_location_off.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_location_off.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_location_off.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_map.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_map.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_map.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_map.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_network_cell.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_network_cell.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_network_cell.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_network_cell.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_network_cell_not_tracked.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_network_cell_not_tracked.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_network_cell_not_tracked.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_network_cell_not_tracked.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_phone.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_phone.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_phone.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_phone.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_remove.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_remove.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_remove.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_remove.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_send_logs.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_send_logs.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_send_logs.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_send_logs.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_settings.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_settings.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_settings.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_settings.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_storage.png b/AIMSICD/src/main/res/drawable-mdpi/ic_action_storage.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_storage.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_action_storage.png diff --git a/app/src/main/res/drawable-mdpi/ic_drawer.png b/AIMSICD/src/main/res/drawable-mdpi/ic_drawer.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_drawer.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_drawer.png diff --git a/app/src/main/res/drawable-mdpi/ic_map_pin_blue.png b/AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_blue.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_map_pin_blue.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_blue.png diff --git a/app/src/main/res/drawable-mdpi/ic_map_pin_green.png b/AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_green.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_map_pin_green.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_green.png diff --git a/app/src/main/res/drawable-mdpi/ic_map_pin_orange.png b/AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_orange.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_map_pin_orange.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_orange.png diff --git a/app/src/main/res/drawable-mdpi/ic_map_pin_red.png b/AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_red.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_map_pin_red.png rename to AIMSICD/src/main/res/drawable-mdpi/ic_map_pin_red.png diff --git a/app/src/main/res/drawable-mdpi/sense_danger.png b/AIMSICD/src/main/res/drawable-mdpi/sense_danger.png similarity index 100% rename from app/src/main/res/drawable-mdpi/sense_danger.png rename to AIMSICD/src/main/res/drawable-mdpi/sense_danger.png diff --git a/app/src/main/res/drawable-mdpi/sense_high.png b/AIMSICD/src/main/res/drawable-mdpi/sense_high.png similarity index 100% rename from app/src/main/res/drawable-mdpi/sense_high.png rename to AIMSICD/src/main/res/drawable-mdpi/sense_high.png diff --git a/app/src/main/res/drawable-mdpi/sense_idle.png b/AIMSICD/src/main/res/drawable-mdpi/sense_idle.png similarity index 100% rename from app/src/main/res/drawable-mdpi/sense_idle.png rename to AIMSICD/src/main/res/drawable-mdpi/sense_idle.png diff --git a/app/src/main/res/drawable-mdpi/sense_medium.png b/AIMSICD/src/main/res/drawable-mdpi/sense_medium.png similarity index 100% rename from app/src/main/res/drawable-mdpi/sense_medium.png rename to AIMSICD/src/main/res/drawable-mdpi/sense_medium.png diff --git a/app/src/main/res/drawable-mdpi/sense_ok.png b/AIMSICD/src/main/res/drawable-mdpi/sense_ok.png similarity index 100% rename from app/src/main/res/drawable-mdpi/sense_ok.png rename to AIMSICD/src/main/res/drawable-mdpi/sense_ok.png diff --git a/app/src/main/res/drawable-mdpi/sense_skull.png b/AIMSICD/src/main/res/drawable-mdpi/sense_skull.png similarity index 100% rename from app/src/main/res/drawable-mdpi/sense_skull.png rename to AIMSICD/src/main/res/drawable-mdpi/sense_skull.png diff --git a/app/src/main/res/drawable-mdpi/stat_sys_download_anim0.png b/AIMSICD/src/main/res/drawable-mdpi/stat_sys_download_anim0.png similarity index 100% rename from app/src/main/res/drawable-mdpi/stat_sys_download_anim0.png rename to AIMSICD/src/main/res/drawable-mdpi/stat_sys_download_anim0.png diff --git a/app/src/main/res/drawable-mdpi/stat_sys_upload_anim0.png b/AIMSICD/src/main/res/drawable-mdpi/stat_sys_upload_anim0.png similarity index 100% rename from app/src/main/res/drawable-mdpi/stat_sys_upload_anim0.png rename to AIMSICD/src/main/res/drawable-mdpi/stat_sys_upload_anim0.png diff --git a/app/src/main/res/drawable-mdpi/track_cell.png b/AIMSICD/src/main/res/drawable-mdpi/track_cell.png similarity index 100% rename from app/src/main/res/drawable-mdpi/track_cell.png rename to AIMSICD/src/main/res/drawable-mdpi/track_cell.png diff --git a/app/src/main/res/drawable-mdpi/untrack_cell.png b/AIMSICD/src/main/res/drawable-mdpi/untrack_cell.png similarity index 100% rename from app/src/main/res/drawable-mdpi/untrack_cell.png rename to AIMSICD/src/main/res/drawable-mdpi/untrack_cell.png diff --git a/app/src/main/res/drawable-mdpi/vp_background_texture.png b/AIMSICD/src/main/res/drawable-mdpi/vp_background_texture.png similarity index 100% rename from app/src/main/res/drawable-mdpi/vp_background_texture.png rename to AIMSICD/src/main/res/drawable-mdpi/vp_background_texture.png diff --git a/app/src/main/res/drawable-mdpi/white_danger.png b/AIMSICD/src/main/res/drawable-mdpi/white_danger.png similarity index 100% rename from app/src/main/res/drawable-mdpi/white_danger.png rename to AIMSICD/src/main/res/drawable-mdpi/white_danger.png diff --git a/app/src/main/res/drawable-mdpi/white_high.png b/AIMSICD/src/main/res/drawable-mdpi/white_high.png similarity index 100% rename from app/src/main/res/drawable-mdpi/white_high.png rename to AIMSICD/src/main/res/drawable-mdpi/white_high.png diff --git a/app/src/main/res/drawable-mdpi/white_idle.png b/AIMSICD/src/main/res/drawable-mdpi/white_idle.png similarity index 100% rename from app/src/main/res/drawable-mdpi/white_idle.png rename to AIMSICD/src/main/res/drawable-mdpi/white_idle.png diff --git a/app/src/main/res/drawable-mdpi/white_medium.png b/AIMSICD/src/main/res/drawable-mdpi/white_medium.png similarity index 100% rename from app/src/main/res/drawable-mdpi/white_medium.png rename to AIMSICD/src/main/res/drawable-mdpi/white_medium.png diff --git a/app/src/main/res/drawable-mdpi/white_ok.png b/AIMSICD/src/main/res/drawable-mdpi/white_ok.png similarity index 100% rename from app/src/main/res/drawable-mdpi/white_ok.png rename to AIMSICD/src/main/res/drawable-mdpi/white_ok.png diff --git a/app/src/main/res/drawable-mdpi/white_skull.png b/AIMSICD/src/main/res/drawable-mdpi/white_skull.png similarity index 100% rename from app/src/main/res/drawable-mdpi/white_skull.png rename to AIMSICD/src/main/res/drawable-mdpi/white_skull.png diff --git a/app/src/main/res/drawable-xhdpi/flat_danger.png b/AIMSICD/src/main/res/drawable-xhdpi/flat_danger.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/flat_danger.png rename to AIMSICD/src/main/res/drawable-xhdpi/flat_danger.png diff --git a/app/src/main/res/drawable-xhdpi/flat_high.png b/AIMSICD/src/main/res/drawable-xhdpi/flat_high.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/flat_high.png rename to AIMSICD/src/main/res/drawable-xhdpi/flat_high.png diff --git a/app/src/main/res/drawable-xhdpi/flat_idle.png b/AIMSICD/src/main/res/drawable-xhdpi/flat_idle.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/flat_idle.png rename to AIMSICD/src/main/res/drawable-xhdpi/flat_idle.png diff --git a/app/src/main/res/drawable-xhdpi/flat_medium.png b/AIMSICD/src/main/res/drawable-xhdpi/flat_medium.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/flat_medium.png rename to AIMSICD/src/main/res/drawable-xhdpi/flat_medium.png diff --git a/app/src/main/res/drawable-xhdpi/flat_ok.png b/AIMSICD/src/main/res/drawable-xhdpi/flat_ok.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/flat_ok.png rename to AIMSICD/src/main/res/drawable-xhdpi/flat_ok.png diff --git a/app/src/main/res/drawable-xhdpi/flat_skull.png b/AIMSICD/src/main/res/drawable-xhdpi/flat_skull.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/flat_skull.png rename to AIMSICD/src/main/res/drawable-xhdpi/flat_skull.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_send_logs.png b/AIMSICD/src/main/res/drawable-xhdpi/ic_action_send_logs.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_send_logs.png rename to AIMSICD/src/main/res/drawable-xhdpi/ic_action_send_logs.png diff --git a/app/src/main/res/drawable-xhdpi/ic_map_pin_blue.png b/AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_blue.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_map_pin_blue.png rename to AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_blue.png diff --git a/app/src/main/res/drawable-xhdpi/ic_map_pin_green.png b/AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_green.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_map_pin_green.png rename to AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_green.png diff --git a/app/src/main/res/drawable-xhdpi/ic_map_pin_orange.png b/AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_orange.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_map_pin_orange.png rename to AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_orange.png diff --git a/app/src/main/res/drawable-xhdpi/ic_map_pin_red.png b/AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_red.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_map_pin_red.png rename to AIMSICD/src/main/res/drawable-xhdpi/ic_map_pin_red.png diff --git a/app/src/main/res/drawable-xhdpi/sense_danger.png b/AIMSICD/src/main/res/drawable-xhdpi/sense_danger.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/sense_danger.png rename to AIMSICD/src/main/res/drawable-xhdpi/sense_danger.png diff --git a/app/src/main/res/drawable-xhdpi/sense_high.png b/AIMSICD/src/main/res/drawable-xhdpi/sense_high.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/sense_high.png rename to AIMSICD/src/main/res/drawable-xhdpi/sense_high.png diff --git a/app/src/main/res/drawable-xhdpi/sense_idle.png b/AIMSICD/src/main/res/drawable-xhdpi/sense_idle.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/sense_idle.png rename to AIMSICD/src/main/res/drawable-xhdpi/sense_idle.png diff --git a/app/src/main/res/drawable-xhdpi/sense_medium.png b/AIMSICD/src/main/res/drawable-xhdpi/sense_medium.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/sense_medium.png rename to AIMSICD/src/main/res/drawable-xhdpi/sense_medium.png diff --git a/app/src/main/res/drawable-xhdpi/sense_ok.png b/AIMSICD/src/main/res/drawable-xhdpi/sense_ok.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/sense_ok.png rename to AIMSICD/src/main/res/drawable-xhdpi/sense_ok.png diff --git a/app/src/main/res/drawable-xhdpi/sense_skull.png b/AIMSICD/src/main/res/drawable-xhdpi/sense_skull.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/sense_skull.png rename to AIMSICD/src/main/res/drawable-xhdpi/sense_skull.png diff --git a/app/src/main/res/drawable-xhdpi/white_danger.png b/AIMSICD/src/main/res/drawable-xhdpi/white_danger.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/white_danger.png rename to AIMSICD/src/main/res/drawable-xhdpi/white_danger.png diff --git a/app/src/main/res/drawable-xhdpi/white_high.png b/AIMSICD/src/main/res/drawable-xhdpi/white_high.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/white_high.png rename to AIMSICD/src/main/res/drawable-xhdpi/white_high.png diff --git a/app/src/main/res/drawable-xhdpi/white_idle.png b/AIMSICD/src/main/res/drawable-xhdpi/white_idle.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/white_idle.png rename to AIMSICD/src/main/res/drawable-xhdpi/white_idle.png diff --git a/app/src/main/res/drawable-xhdpi/white_medium.png b/AIMSICD/src/main/res/drawable-xhdpi/white_medium.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/white_medium.png rename to AIMSICD/src/main/res/drawable-xhdpi/white_medium.png diff --git a/app/src/main/res/drawable-xhdpi/white_ok.png b/AIMSICD/src/main/res/drawable-xhdpi/white_ok.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/white_ok.png rename to AIMSICD/src/main/res/drawable-xhdpi/white_ok.png diff --git a/app/src/main/res/drawable-xhdpi/white_skull.png b/AIMSICD/src/main/res/drawable-xhdpi/white_skull.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/white_skull.png rename to AIMSICD/src/main/res/drawable-xhdpi/white_skull.png diff --git a/app/src/main/res/drawable-xxhdpi/flat_danger.png b/AIMSICD/src/main/res/drawable-xxhdpi/flat_danger.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/flat_danger.png rename to AIMSICD/src/main/res/drawable-xxhdpi/flat_danger.png diff --git a/app/src/main/res/drawable-xxhdpi/flat_high.png b/AIMSICD/src/main/res/drawable-xxhdpi/flat_high.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/flat_high.png rename to AIMSICD/src/main/res/drawable-xxhdpi/flat_high.png diff --git a/app/src/main/res/drawable-xxhdpi/flat_idle.png b/AIMSICD/src/main/res/drawable-xxhdpi/flat_idle.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/flat_idle.png rename to AIMSICD/src/main/res/drawable-xxhdpi/flat_idle.png diff --git a/app/src/main/res/drawable-xxhdpi/flat_medium.png b/AIMSICD/src/main/res/drawable-xxhdpi/flat_medium.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/flat_medium.png rename to AIMSICD/src/main/res/drawable-xxhdpi/flat_medium.png diff --git a/app/src/main/res/drawable-xxhdpi/flat_ok.png b/AIMSICD/src/main/res/drawable-xxhdpi/flat_ok.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/flat_ok.png rename to AIMSICD/src/main/res/drawable-xxhdpi/flat_ok.png diff --git a/app/src/main/res/drawable-xxhdpi/flat_skull.png b/AIMSICD/src/main/res/drawable-xxhdpi/flat_skull.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/flat_skull.png rename to AIMSICD/src/main/res/drawable-xxhdpi/flat_skull.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_send_logs.png b/AIMSICD/src/main/res/drawable-xxhdpi/ic_action_send_logs.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_send_logs.png rename to AIMSICD/src/main/res/drawable-xxhdpi/ic_action_send_logs.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_pin_blue.png b/AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_blue.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_map_pin_blue.png rename to AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_blue.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_pin_green.png b/AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_green.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_map_pin_green.png rename to AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_green.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_pin_orange.png b/AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_orange.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_map_pin_orange.png rename to AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_orange.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_pin_red.png b/AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_red.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_map_pin_red.png rename to AIMSICD/src/main/res/drawable-xxhdpi/ic_map_pin_red.png diff --git a/app/src/main/res/drawable-xxhdpi/sense_danger.png b/AIMSICD/src/main/res/drawable-xxhdpi/sense_danger.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/sense_danger.png rename to AIMSICD/src/main/res/drawable-xxhdpi/sense_danger.png diff --git a/app/src/main/res/drawable-xxhdpi/sense_high.png b/AIMSICD/src/main/res/drawable-xxhdpi/sense_high.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/sense_high.png rename to AIMSICD/src/main/res/drawable-xxhdpi/sense_high.png diff --git a/app/src/main/res/drawable-xxhdpi/sense_idle.png b/AIMSICD/src/main/res/drawable-xxhdpi/sense_idle.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/sense_idle.png rename to AIMSICD/src/main/res/drawable-xxhdpi/sense_idle.png diff --git a/app/src/main/res/drawable-xxhdpi/sense_medium.png b/AIMSICD/src/main/res/drawable-xxhdpi/sense_medium.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/sense_medium.png rename to AIMSICD/src/main/res/drawable-xxhdpi/sense_medium.png diff --git a/app/src/main/res/drawable-xxhdpi/sense_ok.png b/AIMSICD/src/main/res/drawable-xxhdpi/sense_ok.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/sense_ok.png rename to AIMSICD/src/main/res/drawable-xxhdpi/sense_ok.png diff --git a/app/src/main/res/drawable-xxhdpi/sense_skull.png b/AIMSICD/src/main/res/drawable-xxhdpi/sense_skull.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/sense_skull.png rename to AIMSICD/src/main/res/drawable-xxhdpi/sense_skull.png diff --git a/app/src/main/res/drawable-xxhdpi/white_danger.png b/AIMSICD/src/main/res/drawable-xxhdpi/white_danger.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/white_danger.png rename to AIMSICD/src/main/res/drawable-xxhdpi/white_danger.png diff --git a/app/src/main/res/drawable-xxhdpi/white_high.png b/AIMSICD/src/main/res/drawable-xxhdpi/white_high.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/white_high.png rename to AIMSICD/src/main/res/drawable-xxhdpi/white_high.png diff --git a/app/src/main/res/drawable-xxhdpi/white_idle.png b/AIMSICD/src/main/res/drawable-xxhdpi/white_idle.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/white_idle.png rename to AIMSICD/src/main/res/drawable-xxhdpi/white_idle.png diff --git a/app/src/main/res/drawable-xxhdpi/white_medium.png b/AIMSICD/src/main/res/drawable-xxhdpi/white_medium.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/white_medium.png rename to AIMSICD/src/main/res/drawable-xxhdpi/white_medium.png diff --git a/app/src/main/res/drawable-xxhdpi/white_ok.png b/AIMSICD/src/main/res/drawable-xxhdpi/white_ok.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/white_ok.png rename to AIMSICD/src/main/res/drawable-xxhdpi/white_ok.png diff --git a/app/src/main/res/drawable-xxhdpi/white_skull.png b/AIMSICD/src/main/res/drawable-xxhdpi/white_skull.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/white_skull.png rename to AIMSICD/src/main/res/drawable-xxhdpi/white_skull.png diff --git a/app/src/main/res/drawable-xxxhdpi/flat_danger.png b/AIMSICD/src/main/res/drawable-xxxhdpi/flat_danger.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/flat_danger.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/flat_danger.png diff --git a/app/src/main/res/drawable-xxxhdpi/flat_high.png b/AIMSICD/src/main/res/drawable-xxxhdpi/flat_high.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/flat_high.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/flat_high.png diff --git a/app/src/main/res/drawable-xxxhdpi/flat_idle.png b/AIMSICD/src/main/res/drawable-xxxhdpi/flat_idle.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/flat_idle.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/flat_idle.png diff --git a/app/src/main/res/drawable-xxxhdpi/flat_medium.png b/AIMSICD/src/main/res/drawable-xxxhdpi/flat_medium.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/flat_medium.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/flat_medium.png diff --git a/app/src/main/res/drawable-xxxhdpi/flat_ok.png b/AIMSICD/src/main/res/drawable-xxxhdpi/flat_ok.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/flat_ok.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/flat_ok.png diff --git a/app/src/main/res/drawable-xxxhdpi/flat_skull.png b/AIMSICD/src/main/res/drawable-xxxhdpi/flat_skull.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/flat_skull.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/flat_skull.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_delete_database.png b/AIMSICD/src/main/res/drawable-xxxhdpi/ic_action_delete_database.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_action_delete_database.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/ic_action_delete_database.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info.png b/AIMSICD/src/main/res/drawable-xxxhdpi/ic_info.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_info.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/ic_info.png diff --git a/app/src/main/res/drawable-xxxhdpi/sense_danger.png b/AIMSICD/src/main/res/drawable-xxxhdpi/sense_danger.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/sense_danger.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/sense_danger.png diff --git a/app/src/main/res/drawable-xxxhdpi/sense_high.png b/AIMSICD/src/main/res/drawable-xxxhdpi/sense_high.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/sense_high.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/sense_high.png diff --git a/app/src/main/res/drawable-xxxhdpi/sense_idle.png b/AIMSICD/src/main/res/drawable-xxxhdpi/sense_idle.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/sense_idle.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/sense_idle.png diff --git a/app/src/main/res/drawable-xxxhdpi/sense_medium.png b/AIMSICD/src/main/res/drawable-xxxhdpi/sense_medium.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/sense_medium.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/sense_medium.png diff --git a/app/src/main/res/drawable-xxxhdpi/sense_ok.png b/AIMSICD/src/main/res/drawable-xxxhdpi/sense_ok.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/sense_ok.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/sense_ok.png diff --git a/app/src/main/res/drawable-xxxhdpi/sense_skull.png b/AIMSICD/src/main/res/drawable-xxxhdpi/sense_skull.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/sense_skull.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/sense_skull.png diff --git a/app/src/main/res/drawable-xxxhdpi/white_danger.png b/AIMSICD/src/main/res/drawable-xxxhdpi/white_danger.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/white_danger.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/white_danger.png diff --git a/app/src/main/res/drawable-xxxhdpi/white_high.png b/AIMSICD/src/main/res/drawable-xxxhdpi/white_high.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/white_high.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/white_high.png diff --git a/app/src/main/res/drawable-xxxhdpi/white_idle.png b/AIMSICD/src/main/res/drawable-xxxhdpi/white_idle.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/white_idle.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/white_idle.png diff --git a/app/src/main/res/drawable-xxxhdpi/white_medium.png b/AIMSICD/src/main/res/drawable-xxxhdpi/white_medium.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/white_medium.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/white_medium.png diff --git a/app/src/main/res/drawable-xxxhdpi/white_ok.png b/AIMSICD/src/main/res/drawable-xxxhdpi/white_ok.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/white_ok.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/white_ok.png diff --git a/app/src/main/res/drawable-xxxhdpi/white_skull.png b/AIMSICD/src/main/res/drawable-xxxhdpi/white_skull.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/white_skull.png rename to AIMSICD/src/main/res/drawable-xxxhdpi/white_skull.png diff --git a/app/src/main/res/drawable/empty_icon.xml b/AIMSICD/src/main/res/drawable/empty_icon.xml similarity index 100% rename from app/src/main/res/drawable/empty_icon.xml rename to AIMSICD/src/main/res/drawable/empty_icon.xml diff --git a/app/src/main/res/drawable/layer_card_background.xml b/AIMSICD/src/main/res/drawable/layer_card_background.xml similarity index 100% rename from app/src/main/res/drawable/layer_card_background.xml rename to AIMSICD/src/main/res/drawable/layer_card_background.xml diff --git a/app/src/main/res/drawable/layer_card_background_selected.xml b/AIMSICD/src/main/res/drawable/layer_card_background_selected.xml similarity index 100% rename from app/src/main/res/drawable/layer_card_background_selected.xml rename to AIMSICD/src/main/res/drawable/layer_card_background_selected.xml diff --git a/app/src/main/res/drawable/pager_background.xml b/AIMSICD/src/main/res/drawable/pager_background.xml similarity index 100% rename from app/src/main/res/drawable/pager_background.xml rename to AIMSICD/src/main/res/drawable/pager_background.xml diff --git a/app/src/main/res/drawable/progress_bar_states.xml b/AIMSICD/src/main/res/drawable/progress_bar_states.xml similarity index 100% rename from app/src/main/res/drawable/progress_bar_states.xml rename to AIMSICD/src/main/res/drawable/progress_bar_states.xml diff --git a/app/src/main/res/drawable/selector_card_background.xml b/AIMSICD/src/main/res/drawable/selector_card_background.xml similarity index 100% rename from app/src/main/res/drawable/selector_card_background.xml rename to AIMSICD/src/main/res/drawable/selector_card_background.xml diff --git a/app/src/main/res/layout/about_fragment.xml b/AIMSICD/src/main/res/layout/about_fragment.xml similarity index 100% rename from app/src/main/res/layout/about_fragment.xml rename to AIMSICD/src/main/res/layout/about_fragment.xml diff --git a/app/src/main/res/layout/actionbar_indeterminate_progress.xml b/AIMSICD/src/main/res/layout/actionbar_indeterminate_progress.xml similarity index 100% rename from app/src/main/res/layout/actionbar_indeterminate_progress.xml rename to AIMSICD/src/main/res/layout/actionbar_indeterminate_progress.xml diff --git a/app/src/main/res/layout/activity_advanced_sms_user.xml b/AIMSICD/src/main/res/layout/activity_advanced_sms_user.xml similarity index 100% rename from app/src/main/res/layout/activity_advanced_sms_user.xml rename to AIMSICD/src/main/res/layout/activity_advanced_sms_user.xml diff --git a/app/src/main/res/layout/activity_advanced_user.xml b/AIMSICD/src/main/res/layout/activity_advanced_user.xml similarity index 100% rename from app/src/main/res/layout/activity_advanced_user.xml rename to AIMSICD/src/main/res/layout/activity_advanced_user.xml diff --git a/app/src/main/res/layout/activity_debug_logs.xml b/AIMSICD/src/main/res/layout/activity_debug_logs.xml similarity index 100% rename from app/src/main/res/layout/activity_debug_logs.xml rename to AIMSICD/src/main/res/layout/activity_debug_logs.xml diff --git a/app/src/main/res/layout/activity_open_cell_id.xml b/AIMSICD/src/main/res/layout/activity_open_cell_id.xml similarity index 100% rename from app/src/main/res/layout/activity_open_cell_id.xml rename to AIMSICD/src/main/res/layout/activity_open_cell_id.xml diff --git a/app/src/main/res/layout/adv_user_sms_listview.xml b/AIMSICD/src/main/res/layout/adv_user_sms_listview.xml similarity index 100% rename from app/src/main/res/layout/adv_user_sms_listview.xml rename to AIMSICD/src/main/res/layout/adv_user_sms_listview.xml diff --git a/app/src/main/res/layout/adv_user_strings_list.xml b/AIMSICD/src/main/res/layout/adv_user_strings_list.xml similarity index 100% rename from app/src/main/res/layout/adv_user_strings_list.xml rename to AIMSICD/src/main/res/layout/adv_user_strings_list.xml diff --git a/app/src/main/res/layout/at_command_fragment.xml b/AIMSICD/src/main/res/layout/at_command_fragment.xml similarity index 100% rename from app/src/main/res/layout/at_command_fragment.xml rename to AIMSICD/src/main/res/layout/at_command_fragment.xml diff --git a/app/src/main/res/layout/bonuspack_bubble.xml b/AIMSICD/src/main/res/layout/bonuspack_bubble.xml similarity index 100% rename from app/src/main/res/layout/bonuspack_bubble.xml rename to AIMSICD/src/main/res/layout/bonuspack_bubble.xml diff --git a/app/src/main/res/layout/bts_measure_data.xml b/AIMSICD/src/main/res/layout/bts_measure_data.xml similarity index 100% rename from app/src/main/res/layout/bts_measure_data.xml rename to AIMSICD/src/main/res/layout/bts_measure_data.xml diff --git a/app/src/main/res/layout/cell_fragment.xml b/AIMSICD/src/main/res/layout/cell_fragment.xml similarity index 100% rename from app/src/main/res/layout/cell_fragment.xml rename to AIMSICD/src/main/res/layout/cell_fragment.xml diff --git a/app/src/main/res/layout/cell_items.xml b/AIMSICD/src/main/res/layout/cell_items.xml similarity index 100% rename from app/src/main/res/layout/cell_items.xml rename to AIMSICD/src/main/res/layout/cell_items.xml diff --git a/app/src/main/res/layout/creditroll.xml b/AIMSICD/src/main/res/layout/creditroll.xml similarity index 100% rename from app/src/main/res/layout/creditroll.xml rename to AIMSICD/src/main/res/layout/creditroll.xml diff --git a/app/src/main/res/layout/db_view.xml b/AIMSICD/src/main/res/layout/db_view.xml similarity index 100% rename from app/src/main/res/layout/db_view.xml rename to AIMSICD/src/main/res/layout/db_view.xml diff --git a/app/src/main/res/layout/dbe_import_items.xml b/AIMSICD/src/main/res/layout/dbe_import_items.xml similarity index 100% rename from app/src/main/res/layout/dbe_import_items.xml rename to AIMSICD/src/main/res/layout/dbe_import_items.xml diff --git a/app/src/main/res/layout/default_location_items.xml b/AIMSICD/src/main/res/layout/default_location_items.xml similarity index 100% rename from app/src/main/res/layout/default_location_items.xml rename to AIMSICD/src/main/res/layout/default_location_items.xml diff --git a/app/src/main/res/layout/detection_sms_db_listview.xml b/AIMSICD/src/main/res/layout/detection_sms_db_listview.xml similarity index 100% rename from app/src/main/res/layout/detection_sms_db_listview.xml rename to AIMSICD/src/main/res/layout/detection_sms_db_listview.xml diff --git a/app/src/main/res/layout/detection_strings_items.xml b/AIMSICD/src/main/res/layout/detection_strings_items.xml similarity index 100% rename from app/src/main/res/layout/detection_strings_items.xml rename to AIMSICD/src/main/res/layout/detection_strings_items.xml diff --git a/app/src/main/res/layout/device.xml b/AIMSICD/src/main/res/layout/device.xml similarity index 100% rename from app/src/main/res/layout/device.xml rename to AIMSICD/src/main/res/layout/device.xml diff --git a/app/src/main/res/layout/drawer_item.xml b/AIMSICD/src/main/res/layout/drawer_item.xml similarity index 100% rename from app/src/main/res/layout/drawer_item.xml rename to AIMSICD/src/main/res/layout/drawer_item.xml diff --git a/app/src/main/res/layout/drawer_section.xml b/AIMSICD/src/main/res/layout/drawer_section.xml similarity index 100% rename from app/src/main/res/layout/drawer_section.xml rename to AIMSICD/src/main/res/layout/drawer_section.xml diff --git a/app/src/main/res/layout/eventlog_items.xml b/AIMSICD/src/main/res/layout/eventlog_items.xml similarity index 100% rename from app/src/main/res/layout/eventlog_items.xml rename to AIMSICD/src/main/res/layout/eventlog_items.xml diff --git a/app/src/main/res/layout/fragment_details_container.xml b/AIMSICD/src/main/res/layout/fragment_details_container.xml similarity index 100% rename from app/src/main/res/layout/fragment_details_container.xml rename to AIMSICD/src/main/res/layout/fragment_details_container.xml diff --git a/app/src/main/res/layout/inc_buttonbar_divider.xml b/AIMSICD/src/main/res/layout/inc_buttonbar_divider.xml similarity index 100% rename from app/src/main/res/layout/inc_buttonbar_divider.xml rename to AIMSICD/src/main/res/layout/inc_buttonbar_divider.xml diff --git a/app/src/main/res/layout/item_spinner_db_viewer.xml b/AIMSICD/src/main/res/layout/item_spinner_db_viewer.xml similarity index 100% rename from app/src/main/res/layout/item_spinner_db_viewer.xml rename to AIMSICD/src/main/res/layout/item_spinner_db_viewer.xml diff --git a/app/src/main/res/layout/main.xml b/AIMSICD/src/main/res/layout/main.xml similarity index 100% rename from app/src/main/res/layout/main.xml rename to AIMSICD/src/main/res/layout/main.xml diff --git a/app/src/main/res/layout/map.xml b/AIMSICD/src/main/res/layout/map.xml similarity index 100% rename from app/src/main/res/layout/map.xml rename to AIMSICD/src/main/res/layout/map.xml diff --git a/app/src/main/res/layout/marker_info_window.xml b/AIMSICD/src/main/res/layout/marker_info_window.xml similarity index 100% rename from app/src/main/res/layout/marker_info_window.xml rename to AIMSICD/src/main/res/layout/marker_info_window.xml diff --git a/app/src/main/res/layout/measured_signal_str.xml b/AIMSICD/src/main/res/layout/measured_signal_str.xml similarity index 100% rename from app/src/main/res/layout/measured_signal_str.xml rename to AIMSICD/src/main/res/layout/measured_signal_str.xml diff --git a/app/src/main/res/layout/opencelid_items.xml b/AIMSICD/src/main/res/layout/opencelid_items.xml similarity index 100% rename from app/src/main/res/layout/opencelid_items.xml rename to AIMSICD/src/main/res/layout/opencelid_items.xml diff --git a/app/src/main/res/layout/silent_sms_items.xml b/AIMSICD/src/main/res/layout/silent_sms_items.xml similarity index 100% rename from app/src/main/res/layout/silent_sms_items.xml rename to AIMSICD/src/main/res/layout/silent_sms_items.xml diff --git a/app/src/main/res/layout/unique_bts_data.xml b/AIMSICD/src/main/res/layout/unique_bts_data.xml similarity index 100% rename from app/src/main/res/layout/unique_bts_data.xml rename to AIMSICD/src/main/res/layout/unique_bts_data.xml diff --git a/app/src/main/res/menu/activity_debug_logs.xml b/AIMSICD/src/main/res/menu/activity_debug_logs.xml similarity index 100% rename from app/src/main/res/menu/activity_debug_logs.xml rename to AIMSICD/src/main/res/menu/activity_debug_logs.xml diff --git a/app/src/main/res/menu/map_viewer_menu.xml b/AIMSICD/src/main/res/menu/map_viewer_menu.xml similarity index 100% rename from app/src/main/res/menu/map_viewer_menu.xml rename to AIMSICD/src/main/res/menu/map_viewer_menu.xml diff --git a/app/src/main/res/values-cs/translatable_strings.xml b/AIMSICD/src/main/res/values-cs/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-cs/translatable_strings.xml rename to AIMSICD/src/main/res/values-cs/translatable_strings.xml diff --git a/app/src/main/res/values-de/translatable_strings.xml b/AIMSICD/src/main/res/values-de/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-de/translatable_strings.xml rename to AIMSICD/src/main/res/values-de/translatable_strings.xml diff --git a/app/src/main/res/values-es/translatable_strings.xml b/AIMSICD/src/main/res/values-es/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-es/translatable_strings.xml rename to AIMSICD/src/main/res/values-es/translatable_strings.xml diff --git a/app/src/main/res/values-fr/translatable_strings.xml b/AIMSICD/src/main/res/values-fr/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-fr/translatable_strings.xml rename to AIMSICD/src/main/res/values-fr/translatable_strings.xml diff --git a/app/src/main/res/values-ja/translatable_strings.xml b/AIMSICD/src/main/res/values-ja/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-ja/translatable_strings.xml rename to AIMSICD/src/main/res/values-ja/translatable_strings.xml diff --git a/app/src/main/res/values-lt/translatable_strings.xml b/AIMSICD/src/main/res/values-lt/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-lt/translatable_strings.xml rename to AIMSICD/src/main/res/values-lt/translatable_strings.xml diff --git a/app/src/main/res/values-nb/translatable_strings.xml b/AIMSICD/src/main/res/values-nb/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-nb/translatable_strings.xml rename to AIMSICD/src/main/res/values-nb/translatable_strings.xml diff --git a/app/src/main/res/values-nl/translatable_strings.xml b/AIMSICD/src/main/res/values-nl/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-nl/translatable_strings.xml rename to AIMSICD/src/main/res/values-nl/translatable_strings.xml diff --git a/app/src/main/res/values-pl/translatable_strings.xml b/AIMSICD/src/main/res/values-pl/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-pl/translatable_strings.xml rename to AIMSICD/src/main/res/values-pl/translatable_strings.xml diff --git a/app/src/main/res/values-ru/translatable_strings.xml b/AIMSICD/src/main/res/values-ru/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-ru/translatable_strings.xml rename to AIMSICD/src/main/res/values-ru/translatable_strings.xml diff --git a/app/src/main/res/values-sq/translatable_strings.xml b/AIMSICD/src/main/res/values-sq/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-sq/translatable_strings.xml rename to AIMSICD/src/main/res/values-sq/translatable_strings.xml diff --git a/app/src/main/res/values-sv/translatable_strings.xml b/AIMSICD/src/main/res/values-sv/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-sv/translatable_strings.xml rename to AIMSICD/src/main/res/values-sv/translatable_strings.xml diff --git a/app/src/main/res/values-uk/translatable_strings.xml b/AIMSICD/src/main/res/values-uk/translatable_strings.xml similarity index 100% rename from app/src/main/res/values-uk/translatable_strings.xml rename to AIMSICD/src/main/res/values-uk/translatable_strings.xml diff --git a/app/src/main/res/values-w820dp/dimens.xml b/AIMSICD/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from app/src/main/res/values-w820dp/dimens.xml rename to AIMSICD/src/main/res/values-w820dp/dimens.xml diff --git a/app/src/main/res/values/attrs_credits_roll_view.xml b/AIMSICD/src/main/res/values/attrs_credits_roll_view.xml similarity index 100% rename from app/src/main/res/values/attrs_credits_roll_view.xml rename to AIMSICD/src/main/res/values/attrs_credits_roll_view.xml diff --git a/app/src/main/res/values/colors.xml b/AIMSICD/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to AIMSICD/src/main/res/values/colors.xml diff --git a/app/src/main/res/values/config.xml b/AIMSICD/src/main/res/values/config.xml similarity index 100% rename from app/src/main/res/values/config.xml rename to AIMSICD/src/main/res/values/config.xml diff --git a/app/src/main/res/values/dimens.xml b/AIMSICD/src/main/res/values/dimens.xml similarity index 100% rename from app/src/main/res/values/dimens.xml rename to AIMSICD/src/main/res/values/dimens.xml diff --git a/app/src/main/res/values/styles.xml b/AIMSICD/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to AIMSICD/src/main/res/values/styles.xml diff --git a/app/src/main/res/values/themes.xml b/AIMSICD/src/main/res/values/themes.xml similarity index 100% rename from app/src/main/res/values/themes.xml rename to AIMSICD/src/main/res/values/themes.xml diff --git a/app/src/main/res/values/translatable_strings.xml b/AIMSICD/src/main/res/values/translatable_strings.xml similarity index 100% rename from app/src/main/res/values/translatable_strings.xml rename to AIMSICD/src/main/res/values/translatable_strings.xml diff --git a/app/src/main/res/values/untranslatable_strings.xml b/AIMSICD/src/main/res/values/untranslatable_strings.xml similarity index 100% rename from app/src/main/res/values/untranslatable_strings.xml rename to AIMSICD/src/main/res/values/untranslatable_strings.xml diff --git a/app/src/main/res/xml/map_preferences.xml b/AIMSICD/src/main/res/xml/map_preferences.xml similarity index 100% rename from app/src/main/res/xml/map_preferences.xml rename to AIMSICD/src/main/res/xml/map_preferences.xml diff --git a/app/src/main/res/xml/pbar.xml b/AIMSICD/src/main/res/xml/pbar.xml similarity index 100% rename from app/src/main/res/xml/pbar.xml rename to AIMSICD/src/main/res/xml/pbar.xml diff --git a/app/src/main/res/xml/preferences.xml b/AIMSICD/src/main/res/xml/preferences.xml similarity index 100% rename from app/src/main/res/xml/preferences.xml rename to AIMSICD/src/main/res/xml/preferences.xml diff --git a/app/src/system/AndroidManifest.xml b/AIMSICD/src/system/AndroidManifest.xml similarity index 100% rename from app/src/system/AndroidManifest.xml rename to AIMSICD/src/system/AndroidManifest.xml diff --git a/settings.gradle b/settings.gradle index 52354b98b..89531c8e0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', 'third_party:rootshell' +include ':AIMSICD', 'third_party:rootshell' From 50680edfb4d52ea52302ff1c91380df9b24d5520 Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Sun, 13 Dec 2015 23:55:41 +0000 Subject: [PATCH 81/82] Update CHANGELOG.md --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d80abcb62..41adf3008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,30 @@ # CHANGELOG of 'AIMSICD' ---------------------- +#### [13.12.2015 - WIP-Release v0.1.37-alpha](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/releases/tag/v0.1.37-alpha) + +* Changed: Slimmed down permissions to the bare necessary ones to ensure peace for us privacy geeks +* Changed: Moving towards a more usable and polished interface by adding a bit Material Design +* Changed: Versioning from manually editing `AndroidManifest.xml` to using current `commitId` +* Changed: Replaced deprecated `Apache HttpClient` and `HttpUrlConnection` with `okhttp` +* Changed: Resized documentation button in About Fragment to fit screen for more devices +* Changed: Now loading `OSMBonusPack` as Maven dependency, renamed app module to `AIMSICD` +* Updated: Invalid `PSC` is now shown if saved value is higher than 511 (`PSC` max value) +* Updated: Now using Gradle Wrapper 2.9 and cleaned up `AIMSICDDbAdapter` implementation +* Updated: Now using a logging interface and better logging in Activities and Services +* Updated: Cleaned Proguard rules, several `README` improvements with updated links and guides +* Removed: Purged unused `activity_open_cell_id.xml`, `split.rb` and `signing.properties` +* Removed: Purged ProgressBar since it was accessed in a very strange way, will be replaced soon +* Removed: Purged obsolete and redundant things from our `build.gradle` +* Added: New translation for Ukrainian and Norwegian Bokmål, improved Japanese and Spanish +* Added: Gradle magic to also build a system app using system permissions and be included in ROMs +* Fixed: Calling `msgLong` on background thread (no `looper.prepare`) and `ShowToast` lint error +* Fixed: Gradle build fixed, ommiting missing translations while assembling release +* Fixed: `lastLocation` in `LocationTracker` gets assigned, preventing duplicate location reports +* Fixed: Antenna Map Viewer does not crash any more after fixing StringIndexOutOfBoundsException +* Fixed: Simplified version display in About Fragment, improved `lint` and fixed `buildnumbers` +* Fixed: Ensured OpenCellID string consistency so that everyone know which database is meant + #### [15.11.2015 - WIP-Release v0.1.36-alpha-build-00](https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/releases/tag/v0.1.36-alpha-b00) * Changed: **We're now back from a huge break and intend to improve our project in all areas!** From 091ad785c2a1e55508692acfb9e9cfb3e7c64680 Mon Sep 17 00:00:00 2001 From: "Security: Pwned" Date: Sun, 13 Dec 2015 23:55:55 +0000 Subject: [PATCH 82/82] Preparing WIP-Release v0.1.37-alpha --- AIMSICD/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AIMSICD/build.gradle b/AIMSICD/build.gradle index c5817a41c..194cc3754 100644 --- a/AIMSICD/build.gradle +++ b/AIMSICD/build.gradle @@ -24,8 +24,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 19 // Do not change: Working Icons on Android 5+ - versionCode 36 - versionName '0.1.36-alpha' + versionCode 37 + versionName '0.1.37-alpha' testApplicationId "com.SecUpwN.AIMSICD.test" buildConfigField 'String', 'BUILD_NUMBER', (buildNumber == null ? 'null' : "\"${buildNumber}\"")