package org.acra.util;
import java.io.File;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import java.util.Locale;
import org.acra.ACRA;
import org.acra.ACRAConstants;
import android.content.Context;
import android.os.Environment;
import android.os.StatFs;
import android.telephony.TelephonyManager;
import android.text.format.Time;
import android.util.SparseArray;
import static org.acra.ACRA.LOG_TAG;
/**
* Responsible for providing base utilities used when constructing the report.
* <p/>
* @author William Ferguson
* @since 4.3.0
*/
public final class ReportUtils {
/**
* Calculates the free memory of the device. This is based on an inspection of the filesystem, which in android
* devices is stored in RAM.
*
* @return Number of bytes available.
*/
public static long getAvailableInternalMemorySize() {
final File path = Environment.getDataDirectory();
final StatFs stat = new StatFs(path.getPath());
final long blockSize = stat.getBlockSize();
final long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
}
/**
* Calculates the total memory of the device. This is based on an inspection of the filesystem, which in android
* devices is stored in RAM.
*
* @return Total number of bytes.
*/
public static long getTotalInternalMemorySize() {
final File path = Environment.getDataDirectory();
final StatFs stat = new StatFs(path.getPath());
final long blockSize = stat.getBlockSize();
final long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
}
/**
* Returns the DeviceId according to the TelephonyManager.
*
* @param context Context for the application being reported.
* @return Returns the DeviceId according to the TelephonyManager or null if there is no TelephonyManager.
*/
public static String getDeviceId(Context context) {
try {
final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getDeviceId();
} catch (RuntimeException e) {
ACRA.log.w(LOG_TAG, "Couldn't retrieve DeviceId for : " + context.getPackageName(), e);
return null;
}
}
public static String getApplicationFilePath(Context context) {
final File filesDir = context.getFilesDir();
if (filesDir != null) {
return filesDir.getAbsolutePath();
}
ACRA.log.w(LOG_TAG, "Couldn't retrieve ApplicationFilePath for : " + context.getPackageName());
return "Couldn't retrieve ApplicationFilePath";
}
/**
* Utility method used for debugging purposes, writes the content of a SparseArray to a String.
* @param sparseArray
* @return "{ key1 => value1, key2 => value2, ...}"
*/
public static String sparseArrayToString(SparseArray<?> sparseArray) {
StringBuilder result = new StringBuilder();
if (sparseArray == null) {
return "null";
}
result.append('{');
for (int i = 0; i < sparseArray.size(); i++) {
result.append(sparseArray.keyAt(i));
result.append(" => ");
if (sparseArray.valueAt(i) == null) {
result.append("null");
} else {
result.append(sparseArray.valueAt(i).toString());
}
if(i < sparseArray.size() - 1) {
result.append(", ");
}
}
result.append('}');
return result.toString();
}
public static String getLocalIpAddress() {
StringBuilder result = new StringBuilder();
boolean first = true;
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
if(!first) {
result.append('\n');
}
result.append(inetAddress.getHostAddress().toString());
first = false;
}
}
}
} catch (SocketException ex) {
ACRA.log.w(LOG_TAG, ex.toString());
}
return result.toString();
}
public static String getTimeString(Time time)
{
SimpleDateFormat format = new SimpleDateFormat(ACRAConstants.DATE_TIME_FORMAT_STRING, Locale.ENGLISH);
return format.format(time.toMillis(true));
}
}