diff --git a/src/app/build.gradle b/src/app/build.gradle index 9fc1f12..34b0d2a 100644 --- a/src/app/build.gradle +++ b/src/app/build.gradle @@ -10,7 +10,7 @@ android { minSdk 28 targetSdk 32 versionCode 1 - versionName "1.0" + versionName "0.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/src/app/src/main/AndroidManifest.xml b/src/app/src/main/AndroidManifest.xml index 45bc7a3..8880307 100644 --- a/src/app/src/main/AndroidManifest.xml +++ b/src/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ + + parts = smsManager.divideMessage(response); - smsManager.sendMultipartTextMessage (sender, null, parts,null, null); + Utils.sendSms(smsManager, response, sender); return; } // Location permission not granted if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { String response ="Location permission is not granted. Unable to serve request."; - ArrayList parts = smsManager.divideMessage(response); - smsManager.sendMultipartTextMessage (sender, null, parts,null, null); + Utils.sendSms(smsManager, response, sender); return; } @@ -94,7 +94,8 @@ public class SmsHandler { locationManager.getCurrentLocation(LocationManager.FUSED_PROVIDER, null, context.getMainExecutor(), new Consumer() { @Override public void accept(Location location) { - sendGpsCoordinates(smsManager, sender, location.getLatitude(), location.getLongitude()); + String response = Utils.buildCoordinatesResponse(location.getLatitude(), location.getLongitude()); + Utils.sendSms(smsManager, response , sender); } }); } @@ -106,7 +107,8 @@ public class SmsHandler { locationManager.requestSingleUpdate(locationCriteria, new LocationListener() { @Override public void onLocationChanged(@NonNull Location location) { - sendGpsCoordinates(smsManager, sender, location.getLatitude(), location.getLongitude()); + String response = Utils.buildCoordinatesResponse(location.getLatitude(), location.getLongitude()); + Utils.sendSms(smsManager, response, sender); } }, null); } @@ -117,111 +119,118 @@ public class SmsHandler { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - StringBuilder resultSms = new StringBuilder(); + StringBuilder responseSms = new StringBuilder(); - resultSms.append("Network country: "); + responseSms.append("Network country: "); String country = telephony.getNetworkCountryIso(); - resultSms.append(Utils.getCountryNameByIso(country)).append("\n\n"); + responseSms.append(Utils.getCountryNameByIso(country)).append("\n\n"); List availableTowersInRange = telephony.getAllCellInfo(); - resultSms.append("Towers in range: "); + responseSms.append("Towers in range: "); if(availableTowersInRange.size() == 0) { - resultSms.append("none or location is off."); + responseSms.append("none or location is off."); } for(CellInfo tower : availableTowersInRange){ - resultSms.append("\n\n"); + responseSms.append("\n\n"); if(tower.isRegistered()){ - resultSms.append("[Connected to this tower]\n"); + responseSms.append("[Connected to this tower]\n"); } if (tower instanceof CellInfoWcdma) { - resultSms.append("Radio Type: WCDMA\n"); - resultSms.append("Strength: "); - resultSms.append(((CellInfoWcdma)tower).getCellSignalStrength().getLevel()).append("/4\n"); - resultSms.append("CID: ").append(((CellInfoWcdma) tower).getCellIdentity().getCid()).append("\n"); - resultSms.append("LAC: ").append(((CellInfoWcdma) tower).getCellIdentity().getLac()).append("\n"); - resultSms.append("MCC: ").append(((CellInfoWcdma) tower).getCellIdentity().getMccString()).append("\n"); - resultSms.append("MNC: ").append(((CellInfoWcdma) tower).getCellIdentity().getMncString()).append("\n"); + responseSms.append("Radio Type: WCDMA\n"); + responseSms.append("Strength: "); + responseSms.append(((CellInfoWcdma)tower).getCellSignalStrength().getLevel()).append("/4\n"); + responseSms.append("CID: ").append(((CellInfoWcdma) tower).getCellIdentity().getCid()).append("\n"); + responseSms.append("LAC: ").append(((CellInfoWcdma) tower).getCellIdentity().getLac()).append("\n"); + responseSms.append("MCC: ").append(((CellInfoWcdma) tower).getCellIdentity().getMccString()).append("\n"); + responseSms.append("MNC: ").append(((CellInfoWcdma) tower).getCellIdentity().getMncString()).append("\n"); } else if (tower instanceof CellInfoGsm) { - resultSms.append("Radio Type: GSM\n"); - resultSms.append("Strength: "); - resultSms.append(((CellInfoGsm)tower).getCellSignalStrength().getLevel()).append("/4\n"); - resultSms.append("CID: ").append(((CellInfoGsm) tower).getCellIdentity().getCid()).append("\n"); - resultSms.append("LAC: ").append(((CellInfoGsm) tower).getCellIdentity().getLac()).append("\n"); - resultSms.append("MCC: ").append(((CellInfoGsm) tower).getCellIdentity().getMccString()).append("\n"); - resultSms.append("MNC: ").append(((CellInfoGsm) tower).getCellIdentity().getMncString()).append("\n"); + responseSms.append("Radio Type: GSM\n"); + responseSms.append("Strength: "); + responseSms.append(((CellInfoGsm)tower).getCellSignalStrength().getLevel()).append("/4\n"); + responseSms.append("CID: ").append(((CellInfoGsm) tower).getCellIdentity().getCid()).append("\n"); + responseSms.append("LAC: ").append(((CellInfoGsm) tower).getCellIdentity().getLac()).append("\n"); + responseSms.append("MCC: ").append(((CellInfoGsm) tower).getCellIdentity().getMccString()).append("\n"); + responseSms.append("MNC: ").append(((CellInfoGsm) tower).getCellIdentity().getMncString()).append("\n"); } else if (tower instanceof CellInfoLte) { - resultSms.append("Radio Type: LTE\n"); - resultSms.append("Strength: "); - resultSms.append(((CellInfoLte)tower).getCellSignalStrength().getLevel()).append("/4\n"); - resultSms.append("CI: ").append(((CellInfoLte) tower).getCellIdentity().getCi()).append("\n"); - resultSms.append("TAC: ").append(((CellInfoLte) tower).getCellIdentity().getTac()).append("\n"); - resultSms.append("MCC: ").append(((CellInfoLte) tower).getCellIdentity().getMccString()).append("\n"); - resultSms.append("MNC: ").append(((CellInfoLte) tower).getCellIdentity().getMncString()).append("\n"); + responseSms.append("Radio Type: LTE\n"); + responseSms.append("Strength: "); + responseSms.append(((CellInfoLte)tower).getCellSignalStrength().getLevel()).append("/4\n"); + responseSms.append("CI: ").append(((CellInfoLte) tower).getCellIdentity().getCi()).append("\n"); + responseSms.append("TAC: ").append(((CellInfoLte) tower).getCellIdentity().getTac()).append("\n"); + responseSms.append("MCC: ").append(((CellInfoLte) tower).getCellIdentity().getMccString()).append("\n"); + responseSms.append("MNC: ").append(((CellInfoLte) tower).getCellIdentity().getMncString()).append("\n"); } else if (tower instanceof CellInfoCdma) { - resultSms.append("Radio Type: CDMA\n"); - resultSms.append("Strength: "); - resultSms.append(((CellInfoCdma)tower).getCellSignalStrength().getLevel()).append("/4\n"); - resultSms.append("Latitude: ").append(((CellInfoCdma) tower).getCellIdentity().getLatitude()).append("\n"); - resultSms.append("Longitude: ").append(((CellInfoCdma) tower).getCellIdentity().getLongitude()).append("\n"); - resultSms.append("Network ID: ").append(((CellInfoCdma) tower).getCellIdentity().getNetworkId()).append("\n"); - resultSms.append("System ID: ").append(((CellInfoCdma) tower).getCellIdentity().getSystemId()).append("\n"); + responseSms.append("Radio Type: CDMA\n"); + responseSms.append("Strength: "); + responseSms.append(((CellInfoCdma)tower).getCellSignalStrength().getLevel()).append("/4\n"); + responseSms.append("Latitude: ").append(((CellInfoCdma) tower).getCellIdentity().getLatitude()).append("\n"); + responseSms.append("Longitude: ").append(((CellInfoCdma) tower).getCellIdentity().getLongitude()).append("\n"); + responseSms.append("Network ID: ").append(((CellInfoCdma) tower).getCellIdentity().getNetworkId()).append("\n"); + responseSms.append("System ID: ").append(((CellInfoCdma) tower).getCellIdentity().getSystemId()).append("\n"); } } - ArrayList parts = smsManager.divideMessage(resultSms.toString()); - smsManager.sendMultipartTextMessage (sender, null, parts,null, null); + Utils.sendSms(smsManager, responseSms.toString(), sender); } + // battery else if(providedOption.equals(Utils.BATTERY_OPTION)){ IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); - StringBuilder sb = new StringBuilder(); + StringBuilder responseSms = new StringBuilder(); // Battery level int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level * 100 / (float)scale; - sb.append("Battery level: ").append(Math.round(batteryPct)).append("%\n"); + responseSms.append("Battery level: ").append(Math.round(batteryPct)).append("%\n"); // Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; - sb.append("Charging: "); - if(isCharging) sb.append("Yes\n"); - else sb.append("No"); + responseSms.append("Charging: "); + if(isCharging) responseSms.append("Yes\n"); + else responseSms.append("No"); // How are we charging? if(isCharging) { int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); - sb.append("Charging through: "); + responseSms.append("Charging through: "); if(chargePlug == BatteryManager.BATTERY_PLUGGED_USB) - sb.append("USB"); + responseSms.append("USB"); else if(chargePlug == BatteryManager.BATTERY_PLUGGED_AC) - sb.append("AC (wall)"); + responseSms.append("AC (wall)"); else if( chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS) - sb.append("Wireless"); + responseSms.append("Wireless"); else - sb.append("Unknown"); + responseSms.append("Unknown"); } - ArrayList parts = smsManager.divideMessage(sb.toString()); - smsManager.sendMultipartTextMessage (sender, null, parts,null, null); + Utils.sendSms(smsManager, responseSms.toString(), sender); + } + + //callme + // Permission restrictions: https://developer.android.com/guide/components/activities/background-starts + // So we ask to grant the SYSTEM_ALERT_WINDOW permission + else if(providedOption.equals(Utils.CALL_ME_OPTION)){ + // if canDrawOverlays() returns false, not necessarily it will be impossible to + // launch a call. + if(!android.provider.Settings.canDrawOverlays(context)){ + Utils.sendSms(smsManager, "\"Display over other app\" permission was not " + + "granted, thus it might be impossible to initiate a call.", sender); + } + Intent intent = new Intent(Intent.ACTION_CALL); + intent.setData(Uri.parse("tel:" + sender)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + + DevicePolicyManager manager = ((DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)); + manager.lockNow(); } } - - private void sendGpsCoordinates(SmsManager smsManager, String sendTo, double latitude, double longitude){ - - String response = "Coordinates are:" + - "\nLatitude: " + latitude + - "\nLongitude: " + longitude + "\n" + - Utils.buildOSMLink(latitude, longitude); - - ArrayList parts = smsManager.divideMessage(response); - smsManager.sendMultipartTextMessage (sendTo, null, parts,null, null); - } } diff --git a/src/app/src/main/java/com/xfarrow/locatemydevice/Utils.java b/src/app/src/main/java/com/xfarrow/locatemydevice/Utils.java index dea8f6f..e3e5987 100644 --- a/src/app/src/main/java/com/xfarrow/locatemydevice/Utils.java +++ b/src/app/src/main/java/com/xfarrow/locatemydevice/Utils.java @@ -1,5 +1,8 @@ package com.xfarrow.locatemydevice; +import android.telephony.SmsManager; + +import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; @@ -12,14 +15,26 @@ public class Utils { public static final String LOCATE_OPTION = "locate"; public static final String CELLULAR_INFO_OPTION = "cellinfo"; public static final String BATTERY_OPTION = "battery"; - - public static String buildOSMLink(double latitude, double longitude){ - return "https://www.openstreetmap.org/?mlat=" + latitude + "&mlon=" + longitude; - } + public static final String CALL_ME_OPTION = "callme"; public static String getCountryNameByIso(String iso){ Locale locale = new Locale("", iso); return locale.getDisplayCountry(); } + public static void sendSms(SmsManager smsManager, String text, String sendTo){ + ArrayList parts = smsManager.divideMessage(text); + smsManager.sendMultipartTextMessage (sendTo, null, parts,null, null); + } + + public static String buildCoordinatesResponse(double latitude, double longitude){ + return new StringBuilder().append("Coordinates are:") + .append("\nLatitude: ") + .append(latitude) + .append("\nLongitude: ") + .append(longitude) + .append("\n") + .append("https://www.openstreetmap.org/?mlat=").append(latitude).append("&mlon=").append(longitude).toString(); + } + }