summaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/de/blinkt/openvpn/activities/BaseActivity.java27
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java140
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/Dashboard.java18
3 files changed, 185 insertions, 0 deletions
diff --git a/app/src/main/java/de/blinkt/openvpn/activities/BaseActivity.java b/app/src/main/java/de/blinkt/openvpn/activities/BaseActivity.java
new file mode 100644
index 00000000..8cdc1e90
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/activities/BaseActivity.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2012-2015 Arne Schwabe
+ * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
+ */
+
+package de.blinkt.openvpn.activities;
+
+import android.app.Activity;
+import android.app.UiModeManager;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.Window;
+
+public class BaseActivity extends Activity {
+ private boolean isAndroidTV() {
+ final UiModeManager uiModeManager = (UiModeManager) getSystemService(Activity.UI_MODE_SERVICE);
+ return uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ if (isAndroidTV()) {
+ requestWindowFeature(Window.FEATURE_OPTIONS_PANEL);
+ }
+ super.onCreate(savedInstanceState);
+ }
+}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java b/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java
new file mode 100644
index 00000000..5c1741d9
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2012-2015 Arne Schwabe
+ * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
+ */
+
+package de.blinkt.openvpn.core;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Created by arne on 23.01.16.
+ */
+class LogFileHandler extends Handler {
+ static final int TRIM_LOG_FILE = 100;
+ static final int FLUSH_TO_DISK = 101;
+ static final int LOG_INIT = 102;
+ public static final int LOG_MESSAGE = 103;
+ private static FileOutputStream mLogFile;
+ private static BufferedOutputStream mBufLogfile;
+
+ public static final String LOGFILE_NAME = "logcache.dat";
+
+
+ public LogFileHandler(Looper looper) {
+ super(looper);
+ }
+
+
+ @Override
+ public void handleMessage(Message msg) {
+ try {
+ if (msg.what == LOG_INIT) {
+ readLogCache((File) msg.obj);
+ openLogFile((File) msg.obj);
+ } else if (msg.what == LOG_MESSAGE && msg.obj instanceof VpnStatus.LogItem) {
+ // Ignore log messages if not yet initialized
+ if (mLogFile == null)
+ return;
+ writeLogItemToDisk((VpnStatus.LogItem) msg.obj);
+ } else if (msg.what == TRIM_LOG_FILE) {
+ trimLogFile();
+ for (VpnStatus.LogItem li : VpnStatus.getlogbuffer())
+ writeLogItemToDisk(li);
+ } else if (msg.what == FLUSH_TO_DISK) {
+ flushToDisk();
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ VpnStatus.logError("Error during log cache: " + msg.what);
+ VpnStatus.logException(e);
+ }
+
+ }
+
+ private void flushToDisk() throws IOException {
+ mLogFile.flush();
+ }
+
+ private static void trimLogFile() {
+ try {
+ mBufLogfile.flush();
+ mLogFile.getChannel().truncate(0);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ private void writeLogItemToDisk(VpnStatus.LogItem li) throws IOException {
+ Parcel p = Parcel.obtain();
+ li.writeToParcel(p, 0);
+ // We do not really care if the log cache breaks between Android upgrades,
+ // write binary format to disc
+ byte[] liBytes = p.marshall();
+
+ mLogFile.write(liBytes.length & 0xff);
+ mLogFile.write(liBytes.length >> 8);
+ mLogFile.write(liBytes);
+ p.recycle();
+ }
+
+ private void openLogFile (File cacheDir) throws FileNotFoundException {
+ File logfile = new File(cacheDir, LOGFILE_NAME);
+ mLogFile = new FileOutputStream(logfile);
+ mBufLogfile = new BufferedOutputStream(mLogFile);
+ }
+
+ private void readLogCache(File cacheDir) {
+ File logfile = new File(cacheDir, LOGFILE_NAME);
+
+ if (!logfile.exists() || !logfile.canRead())
+ return;
+
+ VpnStatus.logDebug("Reread log items from cache file");
+
+ try {
+ BufferedInputStream logFile = new BufferedInputStream(new FileInputStream(logfile));
+
+ byte[] buf = new byte[8192];
+ int read = logFile.read(buf, 0, 2);
+
+ while (read > 0) {
+ // Marshalled LogItem
+ int len = (0xff & buf[0]) | buf[1] << 8;
+
+ read = logFile.read(buf, 0, len);
+
+ Parcel p = Parcel.obtain();
+ p.unmarshall(buf, 0, read);
+ p.setDataPosition(0);
+ VpnStatus.LogItem li = VpnStatus.LogItem.CREATOR.createFromParcel(p);
+ VpnStatus.newLogItem(li, true);
+ p.recycle();
+
+ //Next item
+ read = logFile.read(buf, 0, 2);
+ }
+
+ } catch (java.io.IOException | java.lang.RuntimeException e) {
+ VpnStatus.logError("Reading cached logfile failed");
+ VpnStatus.logException(e);
+ e.printStackTrace();
+ // ignore reading file error
+ }
+ }
+
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java
index bdc36e89..218b22a7 100644
--- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java
+++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java
@@ -14,6 +14,22 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * Copyright (c) 2013 LEAP Encryption Access Project and contributers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
package se.leap.bitmaskclient;
import android.annotation.*;
@@ -31,6 +47,7 @@ import org.json.*;
import java.net.*;
import butterknife.*;
+import de.blinkt.openvpn.core.VpnStatus;
import se.leap.bitmaskclient.eip.*;
import se.leap.bitmaskclient.userstatus.*;
@@ -75,6 +92,7 @@ public class Dashboard extends Activity implements ProviderAPIResultReceiver.Rec
app = this;
PRNGFixes.apply();
+ VpnStatus.initLogCache(getApplicationContext().getCacheDir());
preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE);
fragment_manager = new FragmentManagerEnhanced(getFragmentManager());