diff --git a/android/widgets/src/main/java/org/nativescript/Process.java b/android/widgets/src/main/java/org/nativescript/Process.java new file mode 100644 index 000000000..cbc42c4ca --- /dev/null +++ b/android/widgets/src/main/java/org/nativescript/Process.java @@ -0,0 +1,59 @@ +package org.nativescript; + +import android.os.SystemClock; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.FileReader; + +/** + * Created by cankov on 15/05/2017. + */ +public class Process { + static long startTime = -1; + + public static long getStartTime() { + if (startTime != -1) { + return startTime; + } + + try { + int pid = android.os.Process.myPid(); + final String path = "/proc/" + pid + "/stat"; + final BufferedReader reader = new BufferedReader(new FileReader(path)); + final String stat; + try { + stat = reader.readLine(); + } finally { + reader.close(); + } + final String field2End = ") "; + final String fieldSep = " "; + final int fieldStartTime = 20; + final int msInSec = 1000; + + final String[] fields = stat.substring(stat.lastIndexOf(field2End)).split(fieldSep); + final long t = Long.parseLong(fields[fieldStartTime]); + int tckName; + try { + tckName = Class.forName("android.system.OsConstants").getField("_SC_CLK_TCK").getInt(null); + } catch (ClassNotFoundException e) { + tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null); + } + final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null); + final long tck = (Long) os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName); + startTime = t * msInSec / tck; + } catch (Exception e) { + Log.v("JS", "Failed to get process start time. Using the current time as start time. Error: " + e); + startTime = SystemClock.elapsedRealtime(); + } + + return startTime; + } + + public static long getUpTime() { + long startTime = getStartTime(); + long currentTime = SystemClock.elapsedRealtime(); + return currentTime - startTime; + } +}