summaryrefslogtreecommitdiff
path: root/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/main/java/de/blinkt/openvpn/core/StatusListener.java')
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/StatusListener.java42
1 files changed, 40 insertions, 2 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
index 13a88974..500cc5e7 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
@@ -5,29 +5,36 @@
package de.blinkt.openvpn.core;
+import static android.app.ApplicationExitInfo.REASON_CRASH_NATIVE;
+
+import android.app.ActivityManager;
+import android.app.ApplicationExitInfo;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.os.Build;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Log;
+
+import androidx.annotation.RequiresApi;
+
import de.blinkt.openvpn.BuildConfig;
import de.blinkt.openvpn.core.VpnStatus.LogLevel;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
+import java.util.List;
/**
* Created by arne on 09.11.16.
*/
public class StatusListener implements VpnStatus.LogListener {
- private File mCacheDir;
- private Context mContext;
private final IStatusCallbacks mCallback = new IStatusCallbacks.Stub() {
@Override
public void newLogItem(LogItem item) throws RemoteException {
@@ -50,6 +57,7 @@ public class StatusListener implements VpnStatus.LogListener {
VpnStatus.setConnectedVPNProfile(uuid);
}
};
+ private File mCacheDir;
private final ServiceConnection mConnection = new ServiceConnection() {
@@ -102,6 +110,7 @@ public class StatusListener implements VpnStatus.LogListener {
}
};
+ private Context mContext;
void init(Context c) {
@@ -112,6 +121,35 @@ public class StatusListener implements VpnStatus.LogListener {
c.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
this.mContext = c;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
+ logLatestExitReasons(c);
+ }
+
+ @RequiresApi(Build.VERSION_CODES.R)
+ private void logLatestExitReasons(Context c) {
+ ActivityManager activityManager = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE);
+ List<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(null, 0, 5);
+ ApplicationExitInfo lastguiexit = null;
+ ApplicationExitInfo lastserviceexit = null;
+ for (ApplicationExitInfo aei : exitReasons) {
+ if (aei.getProcessName().endsWith(":openvpn")) {
+ if (lastserviceexit == null || aei.getTimestamp() > lastserviceexit.getTimestamp())
+ lastserviceexit = aei;
+ } else {
+ if (lastguiexit == null || aei.getTimestamp() > lastguiexit.getTimestamp())
+ lastguiexit = aei;
+ }
+ }
+ logExitNotification(lastserviceexit, "Last exit reason reported by Android for Service Process: ");
+ logExitNotification(lastguiexit, "Last exit reason reported by Android for UI Process: ");
+
+ }
+
+ private void logExitNotification(ApplicationExitInfo aei, String s) {
+ if (aei != null) {
+ LogItem li = new LogItem(LogLevel.DEBUG, s + aei, aei.getTimestamp());
+ VpnStatus.newLogItemIfUnique(li);
+ }
}
@Override