summaryrefslogtreecommitdiff
path: root/ics-openvpn-stripped/main
diff options
context:
space:
mode:
authorParménides GV <parmegv@sdf.org>2014-05-29 10:05:47 +0200
committerParménides GV <parmegv@sdf.org>2014-05-29 10:05:47 +0200
commitaba5a16a97b43f95659e0f79f76549b1fe2e9d56 (patch)
tree4483c95510b72343fadb1f6a89175e0c8cbcec84 /ics-openvpn-stripped/main
parent6fcd101fcbc7779ffd7239cc35e5c3359ae38fcf (diff)
No AIDL nor api, logfragment related xml files
api folder and aidl files aren't needed for us. They are used for external apps that want to use ics-openvpn as an already installed package, while what we want is to avoid the installation of ics-openvpn including it (refactored) in bitmask android.
Diffstat (limited to 'ics-openvpn-stripped/main')
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java19
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java51
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ConfirmDialog.java126
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalAppDatabase.java57
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java317
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/SecurityRemoteException.java12
-rw-r--r--ics-openvpn-stripped/main/src/main/res/layout/log_silders.xml61
-rw-r--r--ics-openvpn-stripped/main/src/main/res/layout/vpnstatus.xml46
-rw-r--r--ics-openvpn-stripped/main/src/main/res/values/dimens.xml7
-rw-r--r--ics-openvpn-stripped/main/src/main/res/values/styles.xml64
10 files changed, 184 insertions, 576 deletions
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java
index c563899d..eead600c 100644
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java
+++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java
@@ -115,19 +115,12 @@ public class LaunchVPN extends Activity {
if(requestCode==START_VPN_PROFILE) {
if(resultCode == Activity.RESULT_OK) {
- int needpw = mSelectedProfile.needUserPWInput();
- if(needpw !=0) {
- VpnStatus.updateStateString("USER_VPN_PASSWORD", "", R.string.state_user_vpn_password,
- ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT);
- askForPW(needpw);
- } else {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- boolean showlogwindow = prefs.getBoolean("showlogwindow", true);
-
- if(!mhideLog && showlogwindow)
- showLogWindow();
- new startOpenVpnThread().start();
- }
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ boolean showlogwindow = prefs.getBoolean("showlogwindow", true);
+
+ if(!mhideLog && showlogwindow)
+ showLogWindow();
+ new startOpenVpnThread().start();
} else if (resultCode == Activity.RESULT_CANCELED) {
// User does not want us to start, so we just vanish
VpnStatus.updateStateString("USER_VPN_PERMISSION_CANCELLED", "", R.string.state_user_vpn_permission_cancelled,
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java
deleted file mode 100644
index a44891ab..00000000
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package de.blinkt.openvpn.api;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class APIVpnProfile implements Parcelable {
-
- public final String mUUID;
- public final String mName;
- public final boolean mUserEditable;
-
- public APIVpnProfile(Parcel in) {
- mUUID = in.readString();
- mName = in.readString();
- mUserEditable = in.readInt() != 0;
- }
-
- public APIVpnProfile(String uuidString, String name, boolean userEditable) {
- mUUID=uuidString;
- mName = name;
- mUserEditable=userEditable;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mUUID);
- dest.writeString(mName);
- if(mUserEditable)
- dest.writeInt(0);
- else
- dest.writeInt(1);
- }
-
- public static final Parcelable.Creator<APIVpnProfile> CREATOR
- = new Parcelable.Creator<APIVpnProfile>() {
- public APIVpnProfile createFromParcel(Parcel in) {
- return new APIVpnProfile(in);
- }
-
- public APIVpnProfile[] newArray(int size) {
- return new APIVpnProfile[size];
- }
- };
-
-
-}
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ConfirmDialog.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ConfirmDialog.java
deleted file mode 100644
index 3856a181..00000000
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ConfirmDialog.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package de.blinkt.openvpn.api;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.AlertDialog.Builder;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnShowListener;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CompoundButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-import se.leap.bitmaskclient.R;
-
-
-public class ConfirmDialog extends Activity implements
-CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener {
- private static final String TAG = "OpenVPNVpnConfirm";
-
- private String mPackage;
-
- private Button mButton;
-
- private AlertDialog mAlert;
-
- @Override
- protected void onResume() {
- super.onResume();
- try {
- mPackage = getCallingPackage();
- if (mPackage==null) {
- finish();
- return;
- }
-
-
- PackageManager pm = getPackageManager();
- ApplicationInfo app = pm.getApplicationInfo(mPackage, 0);
-
- View view = View.inflate(this, R.layout.api_confirm, null);
- ((ImageView) view.findViewById(R.id.icon)).setImageDrawable(app.loadIcon(pm));
- ((TextView) view.findViewById(R.id.prompt)).setText(
- getString(R.string.prompt, app.loadLabel(pm), getString(R.string.app)));
- ((CompoundButton) view.findViewById(R.id.check)).setOnCheckedChangeListener(this);
-
-
- Builder builder = new AlertDialog.Builder(this);
-
- builder.setView(view);
-
- builder.setIconAttribute(android.R.attr.alertDialogIcon);
- builder.setTitle(android.R.string.dialog_alert_title);
- builder.setPositiveButton(android.R.string.ok,this);
- builder.setNegativeButton(android.R.string.cancel,this);
-
- mAlert = builder.create();
- mAlert.setCanceledOnTouchOutside(false);
-
- mAlert.setOnShowListener (new OnShowListener() {
-
- @Override
- public void onShow(DialogInterface dialog) {
- mButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
- mButton.setEnabled(false);
-
- }
- });
-
- //setCloseOnTouchOutside(false);
-
- mAlert.show();
-
- } catch (Exception e) {
- Log.e(TAG, "onResume", e);
- finish();
- }
- }
-
- @Override
- public void onBackPressed() {
- setResult(RESULT_CANCELED);
- finish();
- }
-
- @Override
- public void onCheckedChanged(CompoundButton button, boolean checked) {
- mButton.setEnabled(checked);
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- if (which == DialogInterface.BUTTON_POSITIVE) {
- ExternalAppDatabase extapps = new ExternalAppDatabase(this);
- extapps.addApp(mPackage);
- setResult(RESULT_OK);
- finish();
- }
-
- if (which == DialogInterface.BUTTON_NEGATIVE) {
- setResult(RESULT_CANCELED);
- finish();
- }
- }
-
-}
-
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalAppDatabase.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalAppDatabase.java
deleted file mode 100644
index 02c369b1..00000000
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalAppDatabase.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package de.blinkt.openvpn.api;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.preference.PreferenceManager;
-
-public class ExternalAppDatabase {
-
- Context mContext;
-
- public ExternalAppDatabase(Context c) {
- mContext =c;
- }
-
- private final String PREFERENCES_KEY = "PREFERENCES_KEY";
-
- boolean isAllowed(String packagename) {
- Set<String> allowedapps = getExtAppList();
-
- return allowedapps.contains(packagename);
-
- }
-
- public Set<String> getExtAppList() {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
- return prefs.getStringSet(PREFERENCES_KEY, new HashSet<String>());
- }
-
- void addApp(String packagename)
- {
- Set<String> allowedapps = getExtAppList();
- allowedapps.add(packagename);
- saveExtAppList(allowedapps);
- }
-
- private void saveExtAppList( Set<String> allowedapps) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
- Editor prefedit = prefs.edit();
- prefedit.putStringSet(PREFERENCES_KEY, allowedapps);
- prefedit.apply();
- }
-
- public void clearAllApiApps() {
- saveExtAppList(new HashSet<String>());
- }
-
- public void removeApp(String packagename) {
- Set<String> allowedapps = getExtAppList();
- allowedapps.remove(packagename);
- saveExtAppList(allowedapps);
- }
-
-}
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java
deleted file mode 100644
index 784ec72a..00000000
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package de.blinkt.openvpn.api;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.lang.ref.WeakReference;
-import java.util.LinkedList;
-import java.util.List;
-
-import android.annotation.TargetApi;
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.net.VpnService;
-import android.os.*;
-import se.leap.bitmaskclient.R;
-import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.ConfigParser;
-import de.blinkt.openvpn.core.ConfigParser.ConfigParseError;
-import de.blinkt.openvpn.core.VpnStatus;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
-import de.blinkt.openvpn.core.VpnStatus.StateListener;
-import de.blinkt.openvpn.core.OpenVpnService;
-import de.blinkt.openvpn.core.OpenVpnService.LocalBinder;
-import de.blinkt.openvpn.core.ProfileManager;
-import de.blinkt.openvpn.core.VPNLaunchHelper;
-
-@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
-public class ExternalOpenVPNService extends Service implements StateListener {
-
- private static final int SEND_TOALL = 0;
-
- final RemoteCallbackList<IOpenVPNStatusCallback> mCallbacks =
- new RemoteCallbackList<IOpenVPNStatusCallback>();
-
- private OpenVpnService mService;
- private ExternalAppDatabase mExtAppDb;
-
-
- private ServiceConnection mConnection = new ServiceConnection() {
-
-
- @Override
- public void onServiceConnected(ComponentName className,
- IBinder service) {
- // We've bound to LocalService, cast the IBinder and get LocalService instance
- LocalBinder binder = (LocalBinder) service;
- mService = binder.getService();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName arg0) {
- mService = null;
- }
-
- };
-
- @Override
- public void onCreate() {
- super.onCreate();
- VpnStatus.addStateListener(this);
- mExtAppDb = new ExternalAppDatabase(this);
-
- Intent intent = new Intent(getBaseContext(), OpenVpnService.class);
- intent.setAction(OpenVpnService.START_SERVICE);
-
- bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
- mHandler.setService(this);
- }
-
- private final IOpenVPNAPIService.Stub mBinder = new IOpenVPNAPIService.Stub() {
-
- private void checkOpenVPNPermission() throws SecurityRemoteException {
- PackageManager pm = getPackageManager();
-
- for (String apppackage : mExtAppDb.getExtAppList()) {
- ApplicationInfo app;
- try {
- app = pm.getApplicationInfo(apppackage, 0);
- if (Binder.getCallingUid() == app.uid) {
- return;
- }
- } catch (NameNotFoundException e) {
- // App not found. Remove it from the list
- mExtAppDb.removeApp(apppackage);
- }
-
- }
- throw new SecurityException("Unauthorized OpenVPN API Caller");
- }
-
- @Override
- public List<APIVpnProfile> getProfiles() throws RemoteException {
- checkOpenVPNPermission();
-
- ProfileManager pm = ProfileManager.getInstance(getBaseContext());
-
- List<APIVpnProfile> profiles = new LinkedList<APIVpnProfile>();
-
- for (VpnProfile vp : pm.getProfiles())
- profiles.add(new APIVpnProfile(vp.getUUIDString(), vp.mName, vp.mUserEditable));
-
- return profiles;
- }
-
- @Override
- public void startProfile(String profileUUID) throws RemoteException {
- checkOpenVPNPermission();
-
- Intent shortVPNIntent = new Intent(Intent.ACTION_MAIN);
- shortVPNIntent.setClass(getBaseContext(), de.blinkt.openvpn.LaunchVPN.class);
- shortVPNIntent.putExtra(de.blinkt.openvpn.LaunchVPN.EXTRA_KEY, profileUUID);
- shortVPNIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(shortVPNIntent);
- }
-
- public void startVPN(String inlineconfig) throws RemoteException {
- checkOpenVPNPermission();
-
- ConfigParser cp = new ConfigParser();
- try {
- cp.parseConfig(new StringReader(inlineconfig));
- VpnProfile vp = cp.convertProfile();
- if (vp.checkProfile(getApplicationContext()) != R.string.no_error_found)
- throw new RemoteException(getString(vp.checkProfile(getApplicationContext())));
-
-
- ProfileManager.setTemporaryProfile(vp);
- VPNLaunchHelper.startOpenVpn(vp, getBaseContext());
-
-
- } catch (IOException e) {
- throw new RemoteException(e.getMessage());
- } catch (ConfigParseError e) {
- throw new RemoteException(e.getMessage());
- }
- }
-
- @Override
- public boolean addVPNProfile(String name, String config) throws RemoteException {
- checkOpenVPNPermission();
-
- ConfigParser cp = new ConfigParser();
- try {
- cp.parseConfig(new StringReader(config));
- VpnProfile vp = cp.convertProfile();
- vp.mName = name;
- ProfileManager pm = ProfileManager.getInstance(getBaseContext());
- pm.addProfile(vp);
- } catch (IOException e) {
- VpnStatus.logException(e);
- return false;
- } catch (ConfigParseError e) {
- VpnStatus.logException(e);
- return false;
- }
-
- return true;
- }
-
-
- @Override
- public Intent prepare(String packagename) {
- if (new ExternalAppDatabase(ExternalOpenVPNService.this).isAllowed(packagename))
- return null;
-
- Intent intent = new Intent();
- intent.setClass(ExternalOpenVPNService.this, ConfirmDialog.class);
- return intent;
- }
-
- @Override
- public Intent prepareVPNService() throws RemoteException {
- checkOpenVPNPermission();
-
- if (VpnService.prepare(ExternalOpenVPNService.this) == null)
- return null;
- else
- return new Intent(getBaseContext(), GrantPermissionsActivity.class);
- }
-
-
- @Override
- public void registerStatusCallback(IOpenVPNStatusCallback cb)
- throws RemoteException {
- checkOpenVPNPermission();
-
- if (cb != null) {
- cb.newStatus(mMostRecentState.vpnUUID, mMostRecentState.state,
- mMostRecentState.logmessage, mMostRecentState.level.name());
- mCallbacks.register(cb);
- }
-
-
- }
-
- @Override
- public void unregisterStatusCallback(IOpenVPNStatusCallback cb)
- throws RemoteException {
- checkOpenVPNPermission();
-
- if (cb != null)
- mCallbacks.unregister(cb);
- }
-
- @Override
- public void disconnect() throws RemoteException {
- checkOpenVPNPermission();
- if (mService != null && mService.getManagement() != null)
- mService.getManagement().stopVPN();
- }
-
- @Override
- public void pause() throws RemoteException {
- checkOpenVPNPermission();
- if (mService != null)
- mService.userPause(true);
- }
-
- @Override
- public void resume() throws RemoteException {
- checkOpenVPNPermission();
- if (mService != null)
- mService.userPause(false);
-
- }
- };
-
-
- private UpdateMessage mMostRecentState;
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mCallbacks.kill();
- unbindService(mConnection);
- VpnStatus.removeStateListener(this);
- }
-
- class UpdateMessage {
- public String state;
- public String logmessage;
- public ConnectionStatus level;
- public String vpnUUID;
-
- public UpdateMessage(String state, String logmessage, ConnectionStatus level) {
- this.state = state;
- this.logmessage = logmessage;
- this.level = level;
- }
- }
-
- @Override
- public void updateState(String state, String logmessage, int resid, ConnectionStatus level) {
- mMostRecentState = new UpdateMessage(state, logmessage, level);
- if (ProfileManager.getLastConnectedVpn() != null)
- mMostRecentState.vpnUUID = ProfileManager.getLastConnectedVpn().getUUIDString();
-
- Message msg = mHandler.obtainMessage(SEND_TOALL, mMostRecentState);
- msg.sendToTarget();
-
- }
-
- private static final OpenVPNServiceHandler mHandler = new OpenVPNServiceHandler();
-
-
- static class OpenVPNServiceHandler extends Handler {
- WeakReference<ExternalOpenVPNService> service = null;
-
- private void setService(ExternalOpenVPNService eos) {
- service = new WeakReference<ExternalOpenVPNService>(eos);
- }
-
- @Override
- public void handleMessage(Message msg) {
-
- RemoteCallbackList<IOpenVPNStatusCallback> callbacks;
- switch (msg.what) {
- case SEND_TOALL:
- if (service == null || service.get() == null)
- return;
-
- callbacks = service.get().mCallbacks;
-
-
- // Broadcast to all clients the new value.
- final int N = callbacks.beginBroadcast();
- for (int i = 0; i < N; i++) {
- try {
- sendUpdate(callbacks.getBroadcastItem(i), (UpdateMessage) msg.obj);
- } catch (RemoteException e) {
- // The RemoteCallbackList will take care of removing
- // the dead object for us.
- }
- }
- callbacks.finishBroadcast();
- break;
- }
- }
-
- private void sendUpdate(IOpenVPNStatusCallback broadcastItem,
- UpdateMessage um) throws RemoteException {
- broadcastItem.newStatus(um.vpnUUID, um.state, um.logmessage, um.level.name());
- }
- }
-
-
-} \ No newline at end of file
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/SecurityRemoteException.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/SecurityRemoteException.java
deleted file mode 100644
index 08d90e3b..00000000
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/api/SecurityRemoteException.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package de.blinkt.openvpn.api;
-
-import android.os.RemoteException;
-
-public class SecurityRemoteException extends RemoteException {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
diff --git a/ics-openvpn-stripped/main/src/main/res/layout/log_silders.xml b/ics-openvpn-stripped/main/src/main/res/layout/log_silders.xml
new file mode 100644
index 00000000..0ecb5daa
--- /dev/null
+++ b/ics-openvpn-stripped/main/src/main/res/layout/log_silders.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<LinearLayout
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:id="@+id/logOptionsLayout"
+ android:visibility="gone"
+ tools:visibility="visible"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/log_verbosity_level"/>
+
+
+ <de.blinkt.openvpn.views.SeekBarTicks
+ android:id="@+id/LogLevelSlider"
+ android:layout_width="300dp"
+ android:layout_height="wrap_content"
+ tools:max="5"
+ android:indeterminate="false"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/timestamps"/>
+
+ <RadioGroup
+ android:id="@+id/timeFormatRadioGroup"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <RadioButton
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/timestamps_none"
+ android:id="@+id/radioNone"
+ />
+
+ <RadioButton
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/timestamp_short"
+ android:id="@+id/radioShort"
+ />
+
+ <RadioButton
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/timestamp_iso"
+ android:id="@+id/radioISO"
+ />
+
+
+ </RadioGroup>
+</LinearLayout> \ No newline at end of file
diff --git a/ics-openvpn-stripped/main/src/main/res/layout/vpnstatus.xml b/ics-openvpn-stripped/main/src/main/res/layout/vpnstatus.xml
new file mode 100644
index 00000000..eb7c53ee
--- /dev/null
+++ b/ics-openvpn-stripped/main/src/main/res/layout/vpnstatus.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:tools="http://schemas.android.com/tools"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <Space
+ android:layout_weight="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+
+ <TextView
+ android:text="@string/uploaded_data"
+ style="@style/logWindowStatusTitle"/>
+
+ <TextView
+ style="@style/logWindowStatusText"
+ android:id="@+id/speedUp"
+ tools:text="4 Mbit/s 6.7 GB"/>
+
+ <TextView
+ android:text="@string/downloaded_data"
+ style="@style/logWindowStatusTitle"/>
+
+ <TextView
+ style="@style/logWindowStatusText"
+ android:id="@+id/speedDown"
+ tools:text="2 Mbit/s 4.7 GB"/>
+
+
+ <Space
+ android:layout_weight="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+
+ <TextView
+ android:text="@string/vpn_status"
+ style="@style/logWindowStatusTitle"/>
+
+ <TextView
+ android:id="@+id/speedStatus"
+ tools:text="Connected"
+ style="@style/logWindowStatusText"/>
+
+
+</merge> \ No newline at end of file
diff --git a/ics-openvpn-stripped/main/src/main/res/values/dimens.xml b/ics-openvpn-stripped/main/src/main/res/values/dimens.xml
new file mode 100644
index 00000000..4f325078
--- /dev/null
+++ b/ics-openvpn-stripped/main/src/main/res/values/dimens.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <dimen name="paddingItemsSidebarLog">20dp</dimen>
+ <dimen name="stdpadding">8dp</dimen>
+ <bool name="logSildersAlwaysVisible">false</bool>
+
+</resources> \ No newline at end of file
diff --git a/ics-openvpn-stripped/main/src/main/res/values/styles.xml b/ics-openvpn-stripped/main/src/main/res/values/styles.xml
new file mode 100644
index 00000000..95e709b3
--- /dev/null
+++ b/ics-openvpn-stripped/main/src/main/res/values/styles.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2011 The Android Open Source Project
+ Copyright (C) 2012 Arne Schwabe
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+
+ <style name="item">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+ <item name="android:singleLine">true</item>
+ </style>
+
+ <style name="faqitem">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+ </style>
+
+ <style name="faqhead">
+ <item name="android:paddingTop">10sp</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+ <!-- <item name="android:singleLine">true</item> -->
+ </style>
+
+ <style name="accountSetupButton">
+ <item name="android:layout_width">160sp</item>
+ <item name="android:layout_height">40sp</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+ </style>
+
+ <style name="Theme.CreateShortCut" parent="android:Theme.Holo.DialogWhenLarge" />
+
+ <style name="logWindowStatusText">
+ <item name="android:paddingLeft">@dimen/paddingItemsSidebarLog</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textAppearance">?android:attr/textAppearanceLarge</item>
+ </style>
+
+ <style name="logWindowStatusTitle">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ </style>
+
+
+</resources> \ No newline at end of file