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)); } }