/*******************************************************************************
* Created by Orlando Aliaga
* Copyright 2015 Prey Inc. All rights reserved.
* License: GPLv3
* Full license at "/LICENSE"
******************************************************************************/
package com.prey;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import com.prey.managers.PreyConnectivityManager;
import com.prey.net.PreyWebServices;
import android.*;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.DhcpInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Debug;
import android.support.v4.app.ActivityCompat;
import android.telephony.TelephonyManager;
public class PreyPhone {
private Context ctx;
private Hardware hardware;
private List<Wifi> listWifi;
private Wifi wifi;
public PreyPhone(Context ctx) {
this.ctx = ctx;
init();
}
public static String TAG = "memory";
private void init() {
updateHardware();
updateListWifi();
updateWifi();
update3g();
}
private void update3g() {
}
private void updateHardware() {
Map<String, String> mapData = getProcessorData();
hardware = new Hardware();
hardware.setUuid(getUuid());
hardware.setAndroidDeviceId(getAndroidDeviceId());
hardware.setBiosVendor(Build.MANUFACTURER);
hardware.setBiosVersion(mapData.get("Revision"));
hardware.setMbVendor(Build.MANUFACTURER);
// hardware.setMbVersion(Build.BOOTLOADER );
hardware.setMbModel(Build.BOARD);
//hardware.setMbVersion(mbVersion);
hardware.setCpuModel(mapData.get("Processor"));
hardware.setCpuSpeed(String.valueOf(maxCPUFreqMHz()));
hardware.setCpuCores(String.valueOf(getCpuCores()));
hardware.setRamSize(String.valueOf(getMemoryRamSize()));
// hardware.setRamModules(ramModules);
hardware.setSerialNumber(getSerialNumber());
initMemory();
}
@TargetApi(16)
private void initMemory() {
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long totalMemory = totalMemory();
long freeMemory = memoryInfo.availMem / 1048576L;
long usageMemory = totalMemory - freeMemory;
hardware.setTotalMemory(totalMemory);
hardware.setFreeMemory(totalMemory);
hardware.setBusyMemory(usageMemory);
}
public long totalMemory() {
String line = "";
File file = null;
FileInputStream fi = null;
InputStreamReader ir = null;
BufferedReader br = null;
long totalMemory = 0;
try {
file = new File("/proc/meminfo");
fi = new FileInputStream(file);
ir = new InputStreamReader(fi);
br = new BufferedReader(ir);
while ((line = br.readLine()) != null) {
if (line.indexOf("MemTotal") >= 0) {
line = line.replace("MemTotal", "");
line = line.replace(":", "");
line = line.replace("kB", "");
line = line.trim();
break;
}
}
totalMemory = Long.parseLong(line) / 1024;
} catch (Exception e) {
} finally {
try {
br.close();
} catch (Exception e) {
}
try {
ir.close();
} catch (Exception e) {
}
try {
fi.close();
} catch (Exception e) {
}
}
return totalMemory;
}
public long maxCPUFreqMHz() {
String line = "";
File file = null;
FileInputStream fi = null;
InputStreamReader ir = null;
BufferedReader br = null;
long cpuMaxFreq = 0;
try {
file = new File("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq");
fi = new FileInputStream(file);
ir = new InputStreamReader(fi);
br = new BufferedReader(ir);
while ((line = br.readLine()) != null) {
if (line != null && !"".equals(line)) {
break;
}
}
cpuMaxFreq = Long.parseLong(line) / 1000;
} catch (Exception e) {
} finally {
try {
br.close();
} catch (Exception e) {
}
try {
ir.close();
} catch (Exception e) {
}
try {
fi.close();
} catch (Exception e) {
}
}
return cpuMaxFreq;
}
private void updateWifi() {
wifi = new Wifi();
try {
WifiManager wifiMgr = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
wifi.setWifiEnabled(wifiMgr.isWifiEnabled());
int ipAddress = wifiInfo.getIpAddress();
wifi.setIpAddress(formatterIp(ipAddress));
wifi.setMacAddress(wifiInfo.getMacAddress());
DhcpInfo dhcpInfo = wifiMgr.getDhcpInfo();
wifi.setNetmask(formatterIp(dhcpInfo.netmask));
wifi.setGatewayIp(formatterIp(dhcpInfo.serverAddress));
if (ipAddress != 0) {
wifi.setInterfaceType("Wireless");
} else {
if (PreyConnectivityManager.getInstance(ctx).isMobileConnected()) {
wifi.setInterfaceType("Mobile");
} else {
wifi.setInterfaceType("");
}
}
wifi.setName("eth0");
String ssid = wifiInfo.getSSID();
try {
ssid = ssid.replaceAll("\"", "");
} catch (Exception e) {
}
wifi.setSsid(ssid);
for (int i = 0; listWifi != null && i < listWifi.size(); i++) {
Wifi _wifi = listWifi.get(i);
ssid = _wifi.getSsid();
try {
ssid = ssid.replaceAll("\"", "");
} catch (Exception e) {
}
if (ssid.equals(wifi.getSsid())) {
wifi.setSecurity(_wifi.getSecurity());
wifi.setSignalStrength(_wifi.getSignalStrength());
wifi.setChannel(_wifi.getChannel());
break;
}
}
} catch (Exception e) {
}
}
private String formatterIp(int ipAddress) {
return String.format("%d.%d.%d.%d",
(ipAddress & 0xff),
(ipAddress >> 8 & 0xff),
(ipAddress >> 16 & 0xff),
(ipAddress >> 24 & 0xff));
}
private void updateListWifi() {
listWifi = new ArrayList<PreyPhone.Wifi>();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
|| (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
WifiManager wifiMgr = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> listScanResults = wifiMgr.getScanResults();
for (int i = 0; listScanResults != null && i < listScanResults.size(); i++) {
ScanResult scan = listScanResults.get(i);
Wifi _wifi = new Wifi();
_wifi.setSsid(scan.SSID);
_wifi.setMacAddress(scan.BSSID);
_wifi.setSecurity(scan.capabilities);
_wifi.setSignalStrength(String.valueOf(scan.level));
_wifi.setChannel(String.valueOf(getChannelFromFrequency(scan.frequency)));
listWifi.add(_wifi);
}
}
}
private int getChannelFromFrequency(int frequency) {
return channelsFrequency.indexOf(Integer.valueOf(frequency));
}
public Hardware getHardware() {
return hardware;
}
public List<Wifi> getListWifi() {
return listWifi;
}
public Wifi getWifi() {
return wifi;
}
private final static List<Integer> channelsFrequency = new ArrayList<Integer>(Arrays.asList(0, 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484));
public class Hardware {
private String uuid;
private String biosVendor;
private String biosVersion;
private String mbVendor;
private String mbSerial;
private String mbModel;
private String mbVersion;
private String cpuModel;
private String cpuSpeed;
private String cpuCores;
private String ramSize;
private String ramModules;
private String serialNumber;
private long totalMemory;
private long freeMemory;
private long busyMemory;
private String androidDeviceId;
public long getTotalMemory() {
return totalMemory;
}
public void setTotalMemory(long totalMemory) {
this.totalMemory = totalMemory;
}
public long getFreeMemory() {
return freeMemory;
}
public void setFreeMemory(long freeMemory) {
this.freeMemory = freeMemory;
}
public long getBusyMemory() {
return busyMemory;
}
public void setBusyMemory(long busyMemory) {
this.busyMemory = busyMemory;
}
public String getRamSize() {
return ramSize;
}
public void setRamSize(String ramSize) {
this.ramSize = ramSize;
}
public String getRamModules() {
return ramModules;
}
public void setRamModules(String ramModules) {
this.ramModules = ramModules;
}
public String getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(String serialNumber) {
this.serialNumber = serialNumber;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getBiosVendor() {
return biosVendor;
}
public void setBiosVendor(String biosVendor) {
this.biosVendor = biosVendor;
}
public String getBiosVersion() {
return biosVersion;
}
public void setBiosVersion(String biosVersion) {
this.biosVersion = biosVersion;
}
public String getMbVendor() {
return mbVendor;
}
public void setMbVendor(String mbVendor) {
this.mbVendor = mbVendor;
}
public String getMbSerial() {
return mbSerial;
}
public void setMbSerial(String mbSerial) {
this.mbSerial = mbSerial;
}
public String getMbModel() {
return mbModel;
}
public void setMbModel(String mbModel) {
this.mbModel = mbModel;
}
public String getMbVersion() {
return mbVersion;
}
public void setMbVersion(String mbVersion) {
this.mbVersion = mbVersion;
}
public String getCpuModel() {
return cpuModel;
}
public void setCpuModel(String cpuModel) {
this.cpuModel = cpuModel;
}
public String getCpuSpeed() {
return cpuSpeed;
}
public void setCpuSpeed(String cpuSpeed) {
this.cpuSpeed = cpuSpeed;
}
public String getCpuCores() {
return cpuCores;
}
public void setCpuCores(String cpuCores) {
this.cpuCores = cpuCores;
}
public void setAndroidDeviceId(String androidDeviceId) { this.androidDeviceId = androidDeviceId; }
public String getAndroidDeviceId() { return androidDeviceId; }
}
public class Wifi {
private String name;
private String interfaceType;
private String model;
private String vendor;
private String ipAddress;
private String gatewayIp;
private String netmask;
private String macAddress;
private String ssid;
private String signalStrength;
private String channel;
private String security;
private boolean wifiEnabled;
public boolean isWifiEnabled() {
return wifiEnabled;
}
public void setWifiEnabled(boolean wifiEnabled) {
this.wifiEnabled = wifiEnabled;
}
public String getSsid() {
return ssid;
}
public void setSsid(String ssid) {
this.ssid = ssid;
}
public String getSignalStrength() {
return signalStrength;
}
public void setSignalStrength(String signalStrength) {
this.signalStrength = signalStrength;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getSecurity() {
return security;
}
public void setSecurity(String security) {
this.security = security;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInterfaceType() {
return interfaceType;
}
public void setInterfaceType(String interfaceType) {
this.interfaceType = interfaceType;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getVendor() {
return vendor;
}
public void setVendor(String vendor) {
this.vendor = vendor;
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public String getGatewayIp() {
return gatewayIp;
}
public void setGatewayIp(String gatewayIp) {
this.gatewayIp = gatewayIp;
}
public String getNetmask() {
return netmask;
}
public void setNetmask(String netmask) {
this.netmask = netmask;
}
public String getMacAddress() {
return macAddress;
}
public void setMacAddress(String macAddress) {
this.macAddress = macAddress;
}
}
private long getMemoryRamSize() {
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(mInfo);
return (mInfo.threshold >> 20);
}
private Map<String, String> getProcessorData() {
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(mInfo);
String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
ProcessBuilder pb = new ProcessBuilder(args);
Process process;
Map<String, String> mapData = new HashMap<String, String>();
try {
process = pb.start();
InputStream in = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String aLine;
while ((aLine = br.readLine()) != null) {
String[] data = aLine.split(":");
try {
mapData.put(data[0].trim(), data[1].trim());
} catch (Exception e) {
}
}
if (br != null) {
br.close();
}
} catch (IOException e) {
}
return mapData;
}
private int getCpuCores() {
Runtime runtime = Runtime.getRuntime();
return runtime.availableProcessors();
}
private String getSerialNumber() {
try{
return getUuid();
} catch(Exception e) {
return "";
}
}
public String getIPAddress() {
String ip = "";
try {
ip = PreyWebServices.getInstance().getIPAddress(ctx);
} catch (Exception e) {
}
return ip;
}
private static final int REQUEST_READ_PHONE_STATE_PERMISSION = 225;
private String getAndroidDeviceId() {
return android.provider.Settings.Secure.getString(ctx.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
}
public int getSimState(){
TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
int simState =-1;
try {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
simState = tManager.getSimState();
}
}else {
simState = tManager.getSimState();
}
}catch (Exception e){
PreyLogger.e("Error getSimSerialNumber:"+e.getMessage(),e);
}
return simState;
}
private String getUuid() {
String uuid="";
TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
try {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
uuid=tManager.getDeviceId();
}
}else {
uuid = tManager.getDeviceId();
}
}catch (Exception e){
PreyLogger.e("Error getUuid:"+e.getMessage(),e);
}
return uuid;
}
public String getSimSerialNumber(){
TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
String simSerialNumber ="";
try {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
simSerialNumber = tManager.getSimSerialNumber();
}
}else {
simSerialNumber = tManager.getSimSerialNumber();
}
}catch (Exception e){
PreyLogger.e("Error getSimSerialNumber:"+e.getMessage(),e);
}
PreyLogger.d("simSerialNumber["+simSerialNumber+"]");
return simSerialNumber;
}
public int getDataState(){
TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
int dataState =-1;
try {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
dataState = tManager.getDataState();
}
}else {
dataState = tManager.getDataState();
}
}catch (Exception e){
PreyLogger.e("Error getDataState:"+e.getMessage(),e);
}
return dataState;
}
public String getLine1Number(){
TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
String line1Number ="";
try {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
line1Number = tManager.getLine1Number();
}
}else {
line1Number = tManager.getLine1Number();
}
}catch (Exception e){
PreyLogger.e("Error getDataState:"+e.getMessage(),e);
}
return line1Number;
}
}