package com.cookpad.puree.internal;
import android.app.ActivityManager;
import android.content.Context;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;
// http://stackoverflow.com/questions/19631894/is-there-a-way-to-get-current-process-name-in-android
@ParametersAreNonnullByDefault
public class ProcessName {
@Nonnull
public static String getAndroidProcessName(Context context) {
String name = findProcessNameInLinuxWay();
if (name == null) {
name = findProcessNameInAndroidWay(context);
}
if (name != null) {
return extractAndroidProcessName(name);
} else {
return "";
}
}
static String extractAndroidProcessName(String fullProcessName) {
int pos = fullProcessName.lastIndexOf(':');
if (pos != -1) {
return fullProcessName.substring(pos + 1);
}
return "";
}
static String findProcessNameInLinuxWay() {
BufferedReader cmdlineReader = null;
try {
cmdlineReader = new BufferedReader(new InputStreamReader(
new FileInputStream(
"/proc/" + android.os.Process.myPid() + "/cmdline"),
"UTF-8"));
int c;
StringBuilder processName = new StringBuilder();
while ((c = cmdlineReader.read()) > 0) {
processName.append((char) c);
}
return processName.toString();
} catch (IOException e) {
return null;
} finally {
if (cmdlineReader != null) {
try {
cmdlineReader.close();
} catch (IOException e) {
// noop
}
}
}
}
static String findProcessNameInAndroidWay(Context context) {
int pid = android.os.Process.myPid();
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
return processInfo.processName;
}
}
return null;
}
}