package mobi.acpm.inspeckage.util;
import android.app.ActivityManager;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.NotificationCompat;
import android.util.Base64;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import mobi.acpm.inspeckage.R;
import mobi.acpm.inspeckage.ui.MainActivity;
public class Util {
/**
* Lower case Hex Digits.
*/
private static final String HEX_DIGITS = "0123456789abcdef";
/**
* Byte mask.
*/
private static final int BYTE_MSK = 0xFF;
/**
* Hex digit mask.
*/
private static final int HEX_DIGIT_MASK = 0xF;
/**
* Number of bits per Hex digit (4).
*/
private static final int HEX_DIGIT_BITS = 4;
public static boolean isInt(String s) {
try {
int i = Integer.parseInt(s);
return true;
} catch (NumberFormatException er) {
return false;
}
}
public static String byteArrayToString(byte[] input) {
if(input==null)
return "";
String out = new String(input);
int tmp = 0;
for (int i = 0; i < out.length(); i++) {
int c = out.charAt(i);
if (c >= 32 && c < 127) {
tmp++;
}
}
if (tmp > (out.length() * 0.60)) {
StringBuilder sb = new StringBuilder();
for (byte b : input) {
if (b >= 32 && b < 127)
sb.append(String.format("%c", b));
else
sb.append('.');
}
out = sb.toString();
} else {
out = Base64.encodeToString(input, Base64.NO_WRAP);
}
return out;
}
public static String toHexString(final byte[] byteArray) {
StringBuilder sb = new StringBuilder(byteArray.length * 2);
for (int i = 0; i < byteArray.length; i++) {
int b = byteArray[i] & BYTE_MSK;
sb.append(HEX_DIGITS.charAt(b >>> HEX_DIGIT_BITS)).append(
HEX_DIGITS.charAt(b & HEX_DIGIT_MASK));
}
return sb.toString();
}
public static byte[] getBytes(InputStream is) throws IOException {
int len;
int size = 1024;
byte[] buf;
if (is instanceof ByteArrayInputStream) {
size = is.available();
buf = new byte[size];
len = is.read(buf, 0, size);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
buf = new byte[size];
while ((len = is.read(buf, 0, size)) != -1)
bos.write(buf, 0, len);
buf = bos.toByteArray();
}
return buf;
}
public static void showNotification(Context mContext, String info) {
android.support.v4.app.NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.inspectorw)
.setContentTitle("Inspeckage")
.setContentText(info);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
stackBuilder.addParentStack(MainActivity.class);
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
public static void takeScreenshot(String fileName) {
Process sh;
try {
sh = Runtime.getRuntime().exec("su", null, null);
OutputStream os = sh.getOutputStream();
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
if(new File(path + Config.P_ROOT ).exists() && new File("/storage/emulated/legacy").exists()){
path = "/storage/emulated/legacy";
}
os.write(("/system/bin/screencap -p " + path + Config.P_ROOT + "/" + fileName).getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void setARPEntry(String ip, String mac) {
Process sh;
try {
sh = Runtime.getRuntime().exec("su", null, null);
OutputStream os = sh.getOutputStream();
os.write(("su -c arp -s " + ip + " " + mac + "").getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void copyFileRoot(String path, String dest) {
Process sh;
try {
sh = Runtime.getRuntime().exec("su", null, null);
OutputStream os = sh.getOutputStream();
os.write(("su -c cat " + path + " > " + dest + "").getBytes("UTF-8"));
os.flush();
os.close();
sh.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static StringBuilder sb = new StringBuilder();
public static String FileTree(String path, String ul) {
File root = new File(path);
File[] list = root.listFiles();
if (list == null) return "";
for (File f : list) {
if (f.isDirectory()) {
if (f.getAbsoluteFile().getName().equals("Inspeckage")) {
continue;
}
//DIR
sb.append("<li> <span class=\"glyphicon glyphicon-folder-open\" aria-hidden=\"true\"> " + f.getAbsoluteFile().getName() + "</span>");
sb.append("<ul>");
FileTree(f.getAbsolutePath(), "</ul></li>");
} else {
//FILE
long fileSizeInBytes = f.length();
long fileSizeInKB = 0;
long fileSizeInMB = 0;
String lengh = String.valueOf(fileSizeInBytes) + " B";
if (fileSizeInBytes >= 1024) {
fileSizeInKB = fileSizeInBytes / 1024;
lengh = String.valueOf(fileSizeInKB) + " KB";
}
if (fileSizeInKB >= 1024) {
fileSizeInMB = fileSizeInBytes / 1024;
DecimalFormat df = new DecimalFormat("#,##0.###", new DecimalFormatSymbols(new Locale("pt", "BR")));
String mb = df.format(fileSizeInMB);
lengh = mb + " MB";
}
sb.append("<li><span class=\"glyphicon glyphicon-file\" aria-hidden=\"true\">" +
"</span> <button type=\"button\" class=\"btn btn-link\" onclick=\"download_file('" + f.getAbsoluteFile() + "');\" >"
+ f.getAbsoluteFile().getName() + " - " + lengh + "</button></li>");
}
}
if (!ul.equals("")) {
sb.append("</li></ul>");
}
return sb.toString();
}
public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
public static String imageToBase64(Drawable drawable)
{
Bitmap image = drawableToBitmap(drawable);
ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 70, byteArrayOS);
return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT);
}
public static Bitmap drawableToBitmap (Drawable drawable) {
Bitmap bitmap = null;
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if(bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}