summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/calyx.net.json2
-rw-r--r--app/assets/riseup.net.json2
-rw-r--r--app/src/main/AndroidManifest.xml4
-rw-r--r--app/src/main/ic_launcher-web.pngbin0 -> 39579 bytes
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java38
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/Constants.java5
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/Dashboard.java0
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java219
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/EipFragment.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/MainActivity.java16
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java162
-rw-r--r--app/src/main/res/drawable-hdpi/icon.pngbin7965 -> 0 bytes
-rw-r--r--app/src/main/res/drawable-ldpi/icon.pngbin3118 -> 0 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/icon.pngbin4518 -> 0 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/icon.pngbin11135 -> 0 bytes
-rw-r--r--app/src/main/res/drawable/ic_launcher_background.xml74
-rw-r--r--app/src/main/res/layout-xlarge/about.xml52
-rw-r--r--app/src/main/res/layout/about.xml46
-rw-r--r--app/src/main/res/layout/drawer_main.xml48
-rw-r--r--app/src/main/res/layout/switch_list_item.xml15
-rw-r--r--app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml5
-rw-r--r--app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml5
-rw-r--r--app/src/main/res/mipmap-hdpi/ic_launcher.pngbin0 -> 4054 bytes
-rw-r--r--app/src/main/res/mipmap-hdpi/ic_launcher_foreground.pngbin0 -> 5812 bytes
-rw-r--r--app/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 6301 bytes
-rw-r--r--app/src/main/res/mipmap-mdpi/ic_launcher.pngbin0 -> 2738 bytes
-rw-r--r--app/src/main/res/mipmap-mdpi/ic_launcher_foreground.pngbin0 -> 3796 bytes
-rw-r--r--app/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 3812 bytes
-rw-r--r--app/src/main/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 5607 bytes
-rw-r--r--app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.pngbin0 -> 8292 bytes
-rw-r--r--app/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 8783 bytes
-rw-r--r--app/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 8486 bytes
-rw-r--r--app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.pngbin0 -> 13528 bytes
-rw-r--r--app/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 13542 bytes
-rw-r--r--app/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 11566 bytes
-rw-r--r--app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.pngbin0 -> 20381 bytes
-rw-r--r--app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 19074 bytes
-rw-r--r--app/src/main/res/values-ar/strings_ar.xml12
-rw-r--r--app/src/main/res/values-de/strings.xml13
-rw-r--r--app/src/main/res/values-es/strings.xml7
-rw-r--r--app/src/main/res/values-fa-rIR/strings.xml92
-rw-r--r--app/src/main/res/values-fr/strings.xml16
-rw-r--r--app/src/main/res/values-gl/strings.xml110
-rw-r--r--app/src/main/res/values-nl/strings.xml73
-rw-r--r--app/src/main/res/values-no/strings.xml5
-rw-r--r--app/src/main/res/values-uk/strings.xml1
-rw-r--r--app/src/main/res/values/strings.xml2
-rw-r--r--app/src/main/res/values/untranslatable.xml20
48 files changed, 973 insertions, 73 deletions
diff --git a/app/assets/calyx.net.json b/app/assets/calyx.net.json
index 30ab43c5..69e1c2a6 100644
--- a/app/assets/calyx.net.json
+++ b/app/assets/calyx.net.json
@@ -1,5 +1,5 @@
{
- "api_uri": "https://calyx.net:4430",
+ "api_uri": "https://api.calyx.net:4430",
"api_version": "1",
"ca_cert_fingerprint": "SHA256: 43683c9ba3862c5384a8c1885072fcac40b5d2d4dd67331443f13a3077fa2e69",
"ca_cert_uri": "https://calyx.net/ca.crt",
diff --git a/app/assets/riseup.net.json b/app/assets/riseup.net.json
index 9a5ec79e..82290ecd 100644
--- a/app/assets/riseup.net.json
+++ b/app/assets/riseup.net.json
@@ -16,7 +16,7 @@
"en": "Riseup Networks"
},
"service": {
- "allow_anonymous": false,
+ "allow_anonymous": true,
"allow_free": true,
"allow_limited_bandwidth": false,
"allow_paid": false,
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b11bd89f..740dee08 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,9 +32,9 @@
<application
android:name=".BitmaskApp"
android:allowBackup="true"
- android:icon="@drawable/icon"
+ android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
- android:logo="@drawable/icon"
+ android:logo="@mipmap/ic_launcher"
android:theme="@style/BitmaskTheme">
<service
android:name=".eip.VoidVpnService"
diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png
new file mode 100644
index 00000000..6cf4e79b
--- /dev/null
+++ b/app/src/main/ic_launcher-web.png
Binary files differ
diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
index a21a9601..f07a2a23 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
@@ -16,7 +16,9 @@
*/
package se.leap.bitmaskclient;
+import android.content.Context;
import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
@@ -56,6 +58,7 @@ import java.util.Map;
import java.util.Set;
import static android.R.attr.name;
+import static se.leap.bitmaskclient.Constants.DEFAULT_SHARED_PREFS_BATTERY_SAVER;
import static se.leap.bitmaskclient.Constants.PREFERENCES_APP_VERSION;
import static se.leap.bitmaskclient.Constants.PROVIDER_CONFIGURED;
import static se.leap.bitmaskclient.Constants.PROVIDER_EIP_DEFINITION;
@@ -365,6 +368,7 @@ public class ConfigHelper {
clearDataOfLastProvider(preferences, false);
}
+ @Deprecated
public static void clearDataOfLastProvider(SharedPreferences preferences, boolean commit) {
Map<String, ?> allEntries = preferences.getAll();
List<String> lastProvidersKeys = new ArrayList<>();
@@ -392,18 +396,30 @@ public class ConfigHelper {
}
public static void deleteProviderDetailsFromPreferences(@NonNull SharedPreferences preferences, String providerDomain) {
- preferences.edit().
- remove(Provider.KEY + "." + providerDomain).
- remove(Provider.CA_CERT + "." + providerDomain).
- remove(Provider.CA_CERT_FINGERPRINT + "." + providerDomain).
- remove(Provider.MAIN_URL + "." + providerDomain).
- remove(Provider.KEY + "." + providerDomain).
- remove(Provider.CA_CERT + "." + providerDomain).
- remove(PROVIDER_EIP_DEFINITION + "." + providerDomain).
- remove(PROVIDER_PRIVATE_KEY + "." + providerDomain).
- remove(PROVIDER_VPN_CERTIFICATE + "." + providerDomain).
- apply();
+ preferences.edit().
+ remove(Provider.KEY + "." + providerDomain).
+ remove(Provider.CA_CERT + "." + providerDomain).
+ remove(Provider.CA_CERT_FINGERPRINT + "." + providerDomain).
+ remove(Provider.MAIN_URL + "." + providerDomain).
+ remove(Provider.KEY + "." + providerDomain).
+ remove(Provider.CA_CERT + "." + providerDomain).
+ remove(PROVIDER_EIP_DEFINITION + "." + providerDomain).
+ remove(PROVIDER_PRIVATE_KEY + "." + providerDomain).
+ remove(PROVIDER_VPN_CERTIFICATE + "." + providerDomain).
+ apply();
}
+ public static void saveBattery(Context context, boolean isEnabled) {
+ if (context == null) {
+ return;
+ }
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ preferences.edit().putBoolean(DEFAULT_SHARED_PREFS_BATTERY_SAVER, isEnabled).apply();
+ }
+
+ public static boolean getSaveBattery(@NonNull Context context) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ return preferences.getBoolean(DEFAULT_SHARED_PREFS_BATTERY_SAVER, false);
+ }
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/Constants.java b/app/src/main/java/se/leap/bitmaskclient/Constants.java
index 2b7a8113..58145015 100644
--- a/app/src/main/java/se/leap/bitmaskclient/Constants.java
+++ b/app/src/main/java/se/leap/bitmaskclient/Constants.java
@@ -81,4 +81,9 @@ public interface Constants {
String BROADCAST_RESULT_CODE = "BROADCAST.RESULT_CODE";
String BROADCAST_RESULT_KEY = "BROADCAST.RESULT_KEY";
+
+ //////////////////////////////////////////////
+ // ICS-OPENVPN CONSTANTS
+ /////////////////////////////////////////////
+ String DEFAULT_SHARED_PREFS_BATTERY_SAVER = "screenoff";
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java
deleted file mode 100644
index e69de29b..00000000
--- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java
+++ /dev/null
diff --git a/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java b/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java
new file mode 100644
index 00000000..867f3d48
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2018 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.support.annotation.NonNull;
+import android.support.v7.widget.SwitchCompat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * Created by cyberta on 21.02.18.
+ */
+
+public class DrawerSettingsAdapter extends BaseAdapter {
+
+ //item types
+ public static final int NONE = -1;
+ public static final int SWITCH_PROVIDER = 0;
+ public static final int LOG = 1;
+ public static final int ABOUT = 2;
+ public static final int BATTERY_SAVER = 3;
+
+ //view types
+ public final static int VIEW_SIMPLE_TEXT = 0;
+ public final static int VIEW_SWITCH = 1;
+
+ public static class DrawerSettingsItem {
+ private String description = "";
+ private int viewType = VIEW_SIMPLE_TEXT;
+ private boolean isChecked = false;
+ private int itemType = NONE;
+ private CompoundButton.OnCheckedChangeListener callback;
+
+ private DrawerSettingsItem(String description, int viewType, boolean isChecked, int itemType, CompoundButton.OnCheckedChangeListener callback) {
+ this.description = description;
+ this.viewType = viewType;
+ this.isChecked = isChecked;
+ this.itemType = itemType;
+ this.callback = callback;
+ }
+
+ public static DrawerSettingsItem getSimpleTextInstance(String description, int itemType) {
+ return new DrawerSettingsItem(description, VIEW_SIMPLE_TEXT, false, itemType, null);
+ }
+
+ public static DrawerSettingsItem getSwitchInstance(String description, boolean isChecked, int itemType, CompoundButton.OnCheckedChangeListener callback) {
+ return new DrawerSettingsItem(description, VIEW_SWITCH, isChecked, itemType, callback);
+ }
+
+ public int getItemType() {
+ return itemType;
+ }
+
+ public void setChecked(boolean checked) {
+ isChecked = checked;
+ }
+
+ public boolean isChecked() {
+ return isChecked;
+ }
+ }
+
+ private ArrayList<DrawerSettingsItem> mData = new ArrayList<>();
+ private LayoutInflater mInflater;
+
+ public DrawerSettingsAdapter(LayoutInflater layoutInflater) {
+ mInflater = layoutInflater;
+ }
+
+ public void addItem(final DrawerSettingsItem item) {
+ mData.add(item);
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ DrawerSettingsItem item = mData.get(position);
+ return item.viewType;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ boolean hasSwitchItem = false;
+ for (DrawerSettingsItem item : mData) {
+ if (item.viewType == VIEW_SWITCH) {
+ hasSwitchItem = true;
+ break;
+ }
+ }
+ return hasSwitchItem ? 2 : 1;
+ }
+
+ @Override
+ public int getCount() {
+ return mData.size();
+ }
+
+ @Override
+ public DrawerSettingsItem getItem(int position) {
+ return mData.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+
+ DrawerSettingsItem drawerSettingsItem = mData.get(position);
+ ViewHolder holder = null;
+ int type = getItemViewType(position);
+ if (convertView == null) {
+ holder = new ViewHolder();
+ switch(type) {
+ case VIEW_SIMPLE_TEXT:
+ convertView = initTextViewBinding(holder);
+ holder.textView.setText(drawerSettingsItem.description);
+ break;
+ case VIEW_SWITCH:
+ convertView = initSwitchBinding(holder);
+ bindSwitch(drawerSettingsItem, holder);
+ break;
+ }
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder)convertView.getTag();
+ switch (type) {
+ case VIEW_SIMPLE_TEXT:
+ if (holder.isSwitchViewHolder()) {
+ holder.resetSwitchView();
+ convertView = initTextViewBinding(holder);
+ }
+ holder.textView.setText(drawerSettingsItem.description);
+ break;
+ case VIEW_SWITCH:
+ if (!holder.isSwitchViewHolder()) {
+ holder.resetTextView();
+ convertView = initSwitchBinding(holder);
+ }
+ bindSwitch(drawerSettingsItem, holder);
+ break;
+ }
+ convertView.setTag(holder);
+ }
+ return convertView;
+ }
+
+ private void bindSwitch(DrawerSettingsItem drawerSettingsItem, ViewHolder holder) {
+ holder.switchView.setChecked(drawerSettingsItem.isChecked);
+ holder.switchView.setText(drawerSettingsItem.description);
+ holder.switchView.setOnCheckedChangeListener(drawerSettingsItem.callback);
+ }
+
+ @NonNull
+ private View initSwitchBinding(ViewHolder holder) {
+ View convertView = mInflater.inflate(R.layout.switch_list_item, null);
+ holder.switchView = convertView.findViewById(android.R.id.text1);
+ return convertView;
+ }
+
+ @NonNull
+ private View initTextViewBinding(ViewHolder holder) {
+ View convertView = mInflater.inflate(R.layout.single_list_item, null);
+ holder.textView = convertView.findViewById(android.R.id.text1);
+ return convertView;
+ }
+
+ public DrawerSettingsItem getDrawerItem(int elementType) {
+ for (DrawerSettingsItem item : mData) {
+ if (item.itemType == elementType) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ static class ViewHolder {
+ TextView textView;
+ SwitchCompat switchView;
+
+ boolean isSwitchViewHolder() {
+ return switchView != null;
+ }
+
+ void resetSwitchView() {
+ switchView.setOnCheckedChangeListener(null);
+ switchView = null;
+ }
+
+ void resetTextView() {
+ textView = null;
+ }
+ }
+}
+
+
+
diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
index cb98aaac..34120859 100644
--- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2013 LEAP Encryption Access Project and contributers
+ * Copyright (c) 2018 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
diff --git a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
index b4be55a4..19294618 100644
--- a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
@@ -1,3 +1,19 @@
+/**
+ * Copyright (c) 2018 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;
diff --git a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
index 772140b0..6e39e9ed 100644
--- a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
@@ -1,6 +1,24 @@
+/**
+ * Copyright (c) 2018 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.drawer;
+import android.app.Activity;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
@@ -11,6 +29,7 @@ import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
@@ -22,22 +41,35 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Toast;
import se.leap.bitmaskclient.ConfigHelper;
+import se.leap.bitmaskclient.DrawerSettingsAdapter;
+import se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem;
+import se.leap.bitmaskclient.EipFragment;
import se.leap.bitmaskclient.Provider;
import se.leap.bitmaskclient.ProviderListActivity;
-import se.leap.bitmaskclient.EipFragment;
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.fragments.AboutFragment;
import se.leap.bitmaskclient.fragments.LogFragment;
import static android.content.Context.MODE_PRIVATE;
import static se.leap.bitmaskclient.BitmaskApp.getRefWatcher;
+import static se.leap.bitmaskclient.ConfigHelper.getSaveBattery;
import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER;
import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.ABOUT;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.BATTERY_SAVER;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem.getSimpleTextInstance;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem.getSwitchInstance;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.LOG;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.SWITCH_PROVIDER;
+import static se.leap.bitmaskclient.R.string.about_fragment_title;
+import static se.leap.bitmaskclient.R.string.log_fragment_title;
+import static se.leap.bitmaskclient.R.string.switch_provider_menu_option;
/**
* Fragment used for managing interactions for and presentation of a navigation drawer.
@@ -63,6 +95,7 @@ public class NavigationDrawerFragment extends Fragment {
private ListView mDrawerAccountsListView;
private View mFragmentContainerView;
private ArrayAdapter<String> accountListAdapter;
+ private DrawerSettingsAdapter settingsListAdapter;
private boolean mFromSavedInstanceState;
private boolean mUserLearnedDrawer;
@@ -71,17 +104,23 @@ public class NavigationDrawerFragment extends Fragment {
private SharedPreferences preferences;
+ private final static String KEY_SHOW_ENABLE_EXPERIMENTAL_FEATURE = "KEY_SHOW_ENABLE_EXPERIMENTAL_FEATURE";
+ private boolean showEnableExperimentalFeature = false;
+ AlertDialog alertDialog;
+
public NavigationDrawerFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
// Read in the flag indicating whether or not the user has demonstrated awareness of the
// drawer. See PREF_USER_LEARNED_DRAWER for details.
preferences = getContext().getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE);
mUserLearnedDrawer = preferences.getBoolean(PREF_USER_LEARNED_DRAWER, false);
+ if (savedInstanceState != null) {
+ mFromSavedInstanceState = true;
+ }
}
@Override
@@ -95,6 +134,7 @@ public class NavigationDrawerFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDrawerView = inflater.inflate(R.layout.drawer_main, container, false);
+ restoreFromSavedInstance(savedInstanceState);
return mDrawerView;
}
@@ -119,16 +159,23 @@ public class NavigationDrawerFragment extends Fragment {
selectItem(parent, position);
}
});
+ settingsListAdapter = new DrawerSettingsAdapter(getLayoutInflater());
+ if (getContext() != null) {
+ settingsListAdapter.addItem(getSwitchInstance(getString(R.string.save_battery),
+ getSaveBattery(getContext()),
+ BATTERY_SAVER,
+ new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean newStateIsChecked) {
+ onSwitchItemSelected(BATTERY_SAVER, newStateIsChecked);
+ }
+ }));
+ }
+ settingsListAdapter.addItem(getSimpleTextInstance(getString(switch_provider_menu_option), SWITCH_PROVIDER));
+ settingsListAdapter.addItem(getSimpleTextInstance(getString(log_fragment_title), LOG));
+ settingsListAdapter.addItem(getSimpleTextInstance(getString(about_fragment_title), ABOUT));
- mDrawerSettingsListView.setAdapter(new ArrayAdapter<String>(
- actionBar.getThemedContext(),
- R.layout.single_list_item,
- android.R.id.text1,
- new String[]{
- getString(R.string.switch_provider_menu_option),
- getString(R.string.log_fragment_title),
- getString(R.string.about_fragment_title),
- }));
+ mDrawerSettingsListView.setAdapter(settingsListAdapter);
mDrawerAccountsListView = mDrawerView.findViewById(R.id.accountList);
mDrawerAccountsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@@ -215,12 +262,63 @@ public class NavigationDrawerFragment extends Fragment {
if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
- onNavigationDrawerItemSelected(list, position);
+ onTextItemSelected(list, position);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
+ if (showEnableExperimentalFeature) {
+ outState.putBoolean(KEY_SHOW_ENABLE_EXPERIMENTAL_FEATURE, true);
+ }
+ }
+
+ private void restoreFromSavedInstance(Bundle savedInstanceState) {
+ if (savedInstanceState != null && savedInstanceState.containsKey(KEY_SHOW_ENABLE_EXPERIMENTAL_FEATURE)) {
+ showExperimentalFeatureAlert();
+ }
+ }
+
+ private void showExperimentalFeatureAlert() {
+ Activity activity = getActivity();
+ if (activity == null) {
+ return;
+ }
+
+ try {
+ AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity());
+ showEnableExperimentalFeature = true;
+ alertDialog = alertBuilder.setTitle(activity.getString(R.string.save_battery))
+ .setMessage(activity.getString(R.string.save_battery_message))
+ .setPositiveButton((android.R.string.yes), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ DrawerSettingsItem item = settingsListAdapter.getDrawerItem(BATTERY_SAVER);
+ item.setChecked(true);
+ settingsListAdapter.notifyDataSetChanged();
+ ConfigHelper.saveBattery(getContext(), item.isChecked());
+ }
+ })
+ .setNegativeButton(activity.getString(android.R.string.no), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ disableSwitch(BATTERY_SAVER);
+ }
+ }).setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ showEnableExperimentalFeature = false;
+ }
+ }).setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ disableSwitch(BATTERY_SAVER);
+ }
+ }).show();
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+
}
@Override
@@ -272,7 +370,32 @@ public class NavigationDrawerFragment extends Fragment {
return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
- public void onNavigationDrawerItemSelected(AdapterView<?> parent, int position) {
+ private void onSwitchItemSelected(int elementType, boolean newStateIsChecked) {
+ switch (elementType) {
+ case BATTERY_SAVER:
+ if (ConfigHelper.getSaveBattery(getContext()) == newStateIsChecked) {
+ //initial ui setup, ignore
+ return;
+ }
+ if (newStateIsChecked) {
+ showExperimentalFeatureAlert();
+ } else {
+ ConfigHelper.saveBattery(this.getContext(), false);
+ disableSwitch(BATTERY_SAVER);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void disableSwitch(int elementType) {
+ DrawerSettingsItem item = settingsListAdapter.getDrawerItem(elementType);
+ item.setChecked(false);
+ settingsListAdapter.notifyDataSetChanged();
+ }
+
+ public void onTextItemSelected(AdapterView<?> parent, int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = null;
@@ -286,16 +409,17 @@ public class NavigationDrawerFragment extends Fragment {
fragment.setArguments(arguments);
} else {
Log.d("Drawer", String.format("Selected position %d", position));
- switch (position) {
- case 0:
+ DrawerSettingsItem settingsItem = settingsListAdapter.getItem(position);
+ switch (settingsItem.getItemType()) {
+ case SWITCH_PROVIDER:
getActivity().startActivityForResult(new Intent(getActivity(), ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER);
break;
- case 1:
- mTitle = getString(R.string.log_fragment_title);
+ case LOG:
+ mTitle = getString(log_fragment_title);
fragment = new LogFragment();
break;
- case 2:
- mTitle = getString(R.string.about_fragment_title);
+ case ABOUT:
+ mTitle = getString(about_fragment_title);
fragment = new AboutFragment();
break;
default:
diff --git a/app/src/main/res/drawable-hdpi/icon.png b/app/src/main/res/drawable-hdpi/icon.png
deleted file mode 100644
index 02ede650..00000000
--- a/app/src/main/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/drawable-ldpi/icon.png b/app/src/main/res/drawable-ldpi/icon.png
deleted file mode 100644
index e312075d..00000000
--- a/app/src/main/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/icon.png b/app/src/main/res/drawable-mdpi/icon.png
deleted file mode 100644
index 468314c6..00000000
--- a/app/src/main/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/icon.png b/app/src/main/res/drawable-xhdpi/icon.png
deleted file mode 100644
index ead03720..00000000
--- a/app/src/main/res/drawable-xhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000..01f0af0a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector
+ android:height="108dp"
+ android:width="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#26A69A"
+ android:pathData="M0,0h108v108h-108z"/>
+ <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>
diff --git a/app/src/main/res/layout-xlarge/about.xml b/app/src/main/res/layout-xlarge/about.xml
index ea2251cf..c7896917 100644
--- a/app/src/main/res/layout-xlarge/about.xml
+++ b/app/src/main/res/layout-xlarge/about.xml
@@ -152,6 +152,58 @@
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="@string/copyright_okhttp" />
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="20sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/mbetTLS"
+ android:textSize="24sp"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:autoLink="web"
+ android:text="@string/copyright_mbetTLS" />
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="20sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/asio"
+ android:textSize="24sp"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:text="@string/copyright_asio" />
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="20sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/openvpn3"
+ android:textSize="24sp"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:text="@string/copyright_openvpn3" />
</LinearLayout>
</ScrollView>
diff --git a/app/src/main/res/layout/about.xml b/app/src/main/res/layout/about.xml
index abc12566..aba51141 100644
--- a/app/src/main/res/layout/about.xml
+++ b/app/src/main/res/layout/about.xml
@@ -150,6 +150,52 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/copyright_okhttp" />
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="20sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/mbetTLS"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:autoLink="web"
+ android:text="@string/copyright_mbetTLS" />
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="20sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/asio"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/copyright_asio" />
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="20sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/openvpn3"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/copyright_openvpn3" />
</LinearLayout>
</ScrollView>
diff --git a/app/src/main/res/layout/drawer_main.xml b/app/src/main/res/layout/drawer_main.xml
index 26267bbb..54614f3f 100644
--- a/app/src/main/res/layout/drawer_main.xml
+++ b/app/src/main/res/layout/drawer_main.xml
@@ -1,13 +1,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="@color/colorBackground"
- tools:context="se.leap.bitmaskclient.drawer.NavigationDrawerFragment"
- android:clickable="true"
- android:focusable="true">
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@color/colorBackground"
+ tools:context="se.leap.bitmaskclient.drawer.NavigationDrawerFragment"
+ android:clickable="true"
+ android:focusable="true">
<FrameLayout
android:layout_width="match_parent"
@@ -28,7 +28,6 @@
android:layout_height="wrap_content"
app:srcCompat="@drawable/mask" />
</FrameLayout>
-
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -37,14 +36,33 @@
<ListView
android:id="@+id/accountList"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:isScrollContainer="false"
+ />
- <ListView
- android:id="@+id/settingsList"
+ <View
+ android:id="@+id/divider"
+ android:layout_below="@id/accountList"
+ android:layout_width="match_parent"
+ android:layout_height="1px"
+ android:background="@android:color/darker_gray"
+ />
+
+ <FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:layout_alignParentBottom="true" />
+ android:layout_alignTop="@id/divider"
+ android:layout_alignParentBottom="true"
+ >
+ <ListView
+ android:id="@+id/settingsList"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ />
+ </FrameLayout>
+
+
</RelativeLayout>
diff --git a/app/src/main/res/layout/switch_list_item.xml b/app/src/main/res/layout/switch_list_item.xml
new file mode 100644
index 00000000..bdb9a74c
--- /dev/null
+++ b/app/src/main/res/layout/switch_list_item.xml
@@ -0,0 +1,15 @@
+<android.support.v7.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@android:id/text1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
+ android:gravity="center_vertical"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+ android:background="?android:attr/activatedBackgroundIndicator"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:checked="false"
+ tools:text="someOption" /> \ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..c4a603d4
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon> \ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..c4a603d4
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon> \ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..2d33905e
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..4b5ebe2f
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000..226eb6cd
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..93c5dda3
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..8adc11b3
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000..8b289993
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..f1ffdafa
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..bdaf6943
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..bf47a793
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..8c507b7b
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..7197b58a
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..68139e11
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..c0eafbc4
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..cc095966
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..89d2ec18
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/values-ar/strings_ar.xml b/app/src/main/res/values-ar/strings_ar.xml
new file mode 100644
index 00000000..d432873f
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_ar.xml
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="retry">حاول مجددا</string>
+ <string name="save">حفظ</string>
+ <string name="new_provider_uri">اسم النطاق</string>
+ <string name="username_hint">إسم المستخدم</string>
+ <string name="password_hint">كلمة المرور</string>
+ <string name="login_button">تسجيل الدخول</string>
+ <string name="logout_button">تسجيل الخروج</string>
+ <string name="setup_error_configure_button">تكوين</string>
+ <string name="setup_error_close_button">الخروج</string>
+</resources>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index f42ddb03..38e98e4a 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -23,7 +23,7 @@
<string name="valid_url_entered">Gültige URL</string>
<string name="not_valid_url_entered">Ungültige URL</string>
<string name="provider_details_title">Provider Details</string>
- <string name="use_anonymously_button">Anonym benutzen.</string>
+ <string name="use_anonymously_button">Anonym benutzen</string>
<string name="username_hint">Benutzer*innenname</string>
<string name="username_ask">Bitte geben Sie Ihr Benutzer*innenname ein</string>
<string name="password_ask">Bitte Passwort eingeben</string>
@@ -41,10 +41,10 @@
<string name="error_no_such_algorithm_exception_user_message">Verschlüsselungsalgorithmus nicht gefunden. Bitte aktualisiere deine Android-Version!</string>
<string name="signup_or_login_button">Registrieren / Anmelden</string>
<string name="login_button">Anmelden</string>
- <string name="login_to_profile">Profil anmelden.</string>
+ <string name="login_to_profile">Anmelden</string>
<string name="logout_button">Abmelden</string>
<string name="signup_button">Registrieren</string>
- <string name="create_profile">Profil erstellen.</string>
+ <string name="create_profile">Profil erstellen</string>
<string name="setup_provider">Provider einrichten.</string>
<string name="setup_error_title">Konfigurationsfehler</string>
<string name="setup_error_configure_button">Konfigurieren</string>
@@ -99,7 +99,14 @@
<string name="void_vpn_title">Internetverkehr wird blockiert</string>
<string name="update_provider_details">Providerdetails werden aktualisiert</string>
<string name="update_certificate">Zertifikat aktualisieren</string>
+ <string name="warning_eip_json_corrupted">Die Aktualisierung der Providerkonfiguration ist fehlgeschlagen.</string>
+ <string name="eip_json_corrupted_user_message">Die Aktualisierung der Providerkonfiguration ist fehlgeschlagen. Bitte einloggen, um es erneut zu versuchen.</string>
<string name="warning_corrupted_provider_details">Die gespeicherten Providerdetails sind fehlerhaft. Du kannst entweder Bitmask aktualisieren (Empfehlung) oder die Providerdetails mithilfe eines kommerziellen CA Zertifikates aktualisieren. </string>
<string name="warning_corrupted_provider_cert">Das gespeicherte Providerzertifikat ist ungültig. Du kannst entweder Bitmask aktualisieren (Empfehlung) oder das Providerzertifikat mithilfe eines kommerziellen CA Zertifikates aktualisieren. </string>
<string name="warning_expired_provider_cert">Das gespeicherte Providerzertifikat ist abgelaufen. Du kannst entweder Bitmask aktualisieren (Empfehlung) oder das Providerzertifikat mithilfe eines kommerziellen CA Zertifikates aktualisieren. </string>
+ <string name="downloading_vpn_certificate_failed">Das Herunterladen des VPN Zertifikates ist fehlgeschlagen. Versuche es erneut oder wähle einen anderen Provider aus.</string>
+ <string name="vpn_certificate_is_invalid">Das VPN Zertifikat ist ungültig. Versuche ein neues herunterzuladen.</string>
+ <string name="vpn_certificate_user_message">Das VPN Zertifikat ist ungültig. Bitte melde dich an, um ein neues herunterzuladen.</string>
+ <string name="save_battery">Batteriesparmodus</string>
+ <string name="save_battery_message">Hintergrunddaten werden nicht übertragen während das Telefon inaktiv ist. Diese Funktion ist noch experimentell.</string>
</resources>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 710b1b8d..abb263bc 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -99,7 +99,14 @@
<string name="void_vpn_title">Bloqueando el tráfico</string>
<string name="update_provider_details">Actualizar detalles del proveedor</string>
<string name="update_certificate">Actualizar certificado</string>
+ <string name="warning_eip_json_corrupted">No se pudo actualizar la configuración del proveedor.</string>
+ <string name="eip_json_corrupted_user_message">No se pudo actualizar la configuración del proveedor. Por favor, incie sesión e inténtelo de nuevo.</string>
<string name="warning_corrupted_provider_details">Los detalles del proveedor almacenados están corrompidos. Puede actualizar Bitmask (recomendado), o bien actualizar los detalles del proveedor usando un certificado de una autoridad de certificación/CA comercial.</string>
<string name="warning_corrupted_provider_cert">El certificado del proveedor almacenado no es válido. Puede actualizar Bitmask (recomendado), o bien actualizar el certificado de proveedor usando una autoridad de certificación/CA comercial.</string>
<string name="warning_expired_provider_cert">El certificado del proveedor almacenado ha caducado. Puede actualizar Bitmask (recomendado) o actualizar el certificado de proveedor usando una autoridad de certificación/CA comercial.</string>
+ <string name="downloading_vpn_certificate_failed">No se pudo descargar el certificado de la VPN. Inténtelo de nuevo o escoja otro proveedor.</string>
+ <string name="vpn_certificate_is_invalid">El certificado de la VPN no es válido. Trate de descargar uno nuevo.</string>
+ <string name="vpn_certificate_user_message">El certificado de la VPN no es válido. Por favor, inicie sesión para descargar uno nuevo.</string>
+ <string name="save_battery">Ahorrar batería</string>
+ <string name="save_battery_message">Las conexiones de datos en segundo plano hibernarán cuando su teléfono esté inactivo. Esta característica todavía es experimental.</string>
</resources>
diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml
index 551bdd16..99819cfb 100644
--- a/app/src/main/res/values-fa-rIR/strings.xml
+++ b/app/src/main/res/values-fa-rIR/strings.xml
@@ -1,38 +1,110 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="retry">تلاش دوباره</string>
+ <string name="repository_url_text">دسترسی به منبع کد در https://0xacab.org/leap/bitmask_android </string>
+ <string name="leap_tracker">نظرات، پیشنهادات و گزارش اشکالات در https://0xacab.org/leap/bitmask_android/issues</string>
+ <string name="translation_project_text">از همکاری شما برای ترجمه استقبال می‌کنیم. پروژه Transifex ما در اینجا ببینید: https://www.transifex.com/projects/p/bitmask-android/</string>
<string name="switch_provider_menu_option">تعویض ارائه دهنده</string>
<string name="info">اطلاعات</string>
- <string name="show_connection_details">نمایش اطلاعات تماس</string>
+ <string name="show_connection_details">نمایش جزئیات ارتباط</string>
<string name="routes_info">مسیرها: %s</string>
+ <string name="routes_info6">مسیرهای IPv6: %s</string>
<string name="error_empty_username">نام کاربری نباید خالی باشد.</string>
+ <string name="cert_from_keystore">گرفتن تصدیق \'%s\' از کی‌استور</string>
<string name="provider_label">ارائه‌دهنده:</string>
- <string name="provider_label_none">ارائه‌دهنده‌ای تنظیم نشده</string>
- <string name="status_unknown">وضعیت نامشخص.</string>
+ <string name="provider_label_none">ارائه‌دهنده‌ای تنظیم نشده است</string>
+ <string name="status_unknown">وضعیت نامشخص</string>
+ <string name="eip_service_label">دسترسی کدگزاری شده به اینترنت با وی‌پی‌ان</string>
+ <string name="configuration_wizard_title">انتخاب سرویس ارائه‌دهنده</string>
+ <string name="add_provider">اضافه کردن ارائه‌دهنده جدید</string>
<string name="introduce_new_provider">ارائه‌دهنده‌ی سروریس جدید وارد کنید</string>
<string name="save">ذخیره</string>
<string name="new_provider_uri">نام دامنه</string>
- <string name="use_anonymously_button">استفاده از ناشناسی</string>
+ <string name="valid_url_entered">URL معتبر است</string>
+ <string name="not_valid_url_entered">URL صحیح نیست</string>
+ <string name="provider_details_title">اطلاعات ارائه‌دهنده</string>
+ <string name="use_anonymously_button">استفاده به صورت ناشناس</string>
<string name="username_hint">نام کاربری</string>
<string name="username_ask">لطفا شناسه‌ی خود را وارد کنید</string>
- <string name="password_hint">کلمه عبور</string>
+ <string name="password_ask">لطفا رمز عبور خود را وارد کنید</string>
+ <string name="password_hint">رمز عبور</string>
+ <string name="password_match">رمزهای عبور یکسان است</string>
+ <string name="password_mismatch">رمزهای عبور یکسان نیست</string>
<string name="user_message">پیغام کاربر</string>
- <string name="error_bad_user_password_user_message">شناسه یا رمز نادرست</string>
- <string name="error_client_http_user_message">تلاش دوباره: خطای HTTP کاربر</string>
- <string name="error_io_exception_user_message">تلاش دوباره: خطای I/O</string>
- <string name="error_json_exception_user_message">تلاش دوباره: پاسخ نامناسب از سرور</string>
+ <string name="about_fragment_title">درباره‌</string>
+ <string name="error_srp_math_error_user_message">دوباره تلاش کنید: اشکال در سرور</string>
+ <string name="error_bad_user_password_user_message">نام کاربری یا رمز نادرست</string>
+ <string name="error_not_valid_password_user_message">باید حداقل ۸ حرف باشد.</string>
+ <string name="error_client_http_user_message">دوباره تلاش کنید: خطای HTTP کاربر</string>
+ <string name="error_io_exception_user_message">دوباره تلاش کنید: خطای I/O</string>
+ <string name="error_json_exception_user_message">دوباره تلاش کنید: پاسخ نامناسب از سرور</string>
+ <string name="error_no_such_algorithm_exception_user_message">الگوریتم کدگذاری‌شده یافت نشد. لطفا آندروید را به‌روز رسانی کنید!</string>
+ <string name="signup_or_login_button">ثبت نام/ ورود</string>
<string name="login_button">ورود</string>
- <string name="logout_button">برون رفت</string>
+ <string name="login_to_profile">ورود به صفحه شخصی</string>
+ <string name="logout_button">خروج</string>
+ <string name="signup_button">ثبت‌نام</string>
+ <string name="create_profile">درست‌کردن صفحه شخصی</string>
+ <string name="setup_provider">تنظیم ارائه‌دهنده</string>
<string name="setup_error_title">خطای تنظیمات</string>
<string name="setup_error_configure_button">تنظیم</string>
<string name="setup_error_close_button">خروج</string>
+ <string name="setup_error_text">خطای تنظیم بیتمسک با ارائه‌دهنده انتخابی شما. n\n\ تنظیم را دوباره انجام دهید یا از برنامه خارج شوید و تنظیم ارائه‌دهنده را با بازکردن مجدد انجام دهید.</string>
+ <string name="server_unreachable_message">سرور قابل دسترس نیست، لطفا دوباره تلاش کنید.</string>
+ <string name="error.security.pinnedcertificate">اخطار امنیتی، برنامه app را به‌روز رسانی کنید یا ارائه‌دهنده دیگری انتخاب کنید.</string>
<string name="malformed_url">به نظر نمی‌رسد که یک ارائه‌دهنده‌ی بیتمسک باشد.</string>
<string name="certificate_error">این یک ارائه‌دهنده‌ی قابل اعتماد بیتمسک نیست.</string>
+ <string name="service_is_down_error">سرور وی‌پی‌ان در دسترس نیست.</string>
<string name="configuring_provider">در حال تنظیم کردن ارائه‌دهنده</string>
<string name="incorrectly_downloaded_certificate_message">گواهی ناشناسی شما دریافت نشد</string>
+ <string name="downloading_certificate_message">دریافت گواهی وی‌پی‌ان</string>
+ <string name="updating_certificate_message">به‌روز رسانی گواهی وی‌پی‌ان</string>
+ <string name="login.riseup.warning">کاربران Riseup نیاز به ساختن حساب کاربری جداگانه‌ای برای استفاده از وی‌پی‌ان دارند</string>
+ <string name="succesful_authentication_message">احراز هویت</string>
<string name="authentication_failed_message">احراز هویت ناموفق بود.</string>
+ <string name="registration_failed_message">ثبت‌ ناموفق</string>
<string name="eip_status_start_pending">آماده‌سازی اتصال</string>
<string name="eip_cancel_connect_title">انصراف از اتصال؟</string>
<string name="eip_cancel_connect_text">تلاشی برای برقراری ارتباط در جریان است. آیا می‌خواهید آن را قطع کنید؟</string>
+ <string name="eip.warning.browser_inconsistency">خاموش کردن اتصال با وی‌پی‌ان؟ وقتی وی‌پی‌ان خاموش است، اطلاعات شما ممکن است توسط ارائه‌دهنده اینترنت و یا شبکه محلی قابل دسترس باشد.</string>
+ <string name="eip_state_not_connected">کار نمی‌کند! اتصال ناامن!</string>
<string name="eip_state_connected">اتصال امن.</string>
+ <string name="provider_problem">به نظر می‌رسد مشکلی با ارائه‌دهنده وجود دارد.</string>
+ <string name="try_another_provider">لطفا از ارائه‌دهنده دیگری استفاده کنید و یا با ارائه‌دهنده تماس بگیرید.</string>
+ <string name="default_username">ناشناس</string>
+ <string name="logged_in_user_status">وارد شده است.</string>
+ <string name="logged_out_user_status">خارج شده است</string>
+ <string name="didnt_log_out_user_status">خارج نشده‌است. بعدا دوباره امتحان کنید، ممکن است مشکلی در شبکه یا با ارائه‌دهنده باشد. اگر قابل حل نیست، اطلاعات بیتمسک را از روی تنظیمات اندروید پاک کنید. </string>
+ <string name="not_logged_in_user_status">وارد نشده است.</string>
+ <string name="logging_in_user_status">در حال ورود.</string>
+ <string name="logging_in">وارد شدن</string>
+ <string name="signing_up">ثبت‌نام کردن</string>
+ <string name="logging_out_user_status">در حال خروج.</string>
+ <string name="signingup_message">ثبت شده است.</string>
+ <string name="vpn.button.turn.on">روشن کردن</string>
+ <string name="vpn.button.turn.off">خاموش کردن</string>
+ <string name="vpn_button_turn_off_blocking">توقف مسدود کردن</string>
+ <string name="vpn_securely_routed">ترافیک شما به صورت امن از اینجا گذشته است:</string>
+ <string name="bitmask_log">لاگ بیتمسک</string>
+ <string name="title_activity_main">بیتمسک</string>
+ <string name="log_fragment_title">لاگ</string>
+ <string name="vpn_fragment_title">وی‌پی‌ان</string>
+ <string name="navigation_drawer_open">بازکردن نوار ابزار</string>
+ <string name="navigation_drawer_close">بستن نوار ابزار</string>
+ <string name="action_example">فعالیت نمونه</string>
+ <string name="action_settings">تنظیمات</string>
+ <string name="void_vpn_establish">بیتمسک تمام ترافیک خروجی اینترنت را مسدود می‌کند.</string>
+ <string name="void_vpn_error_establish">ناموفق در راه‌اندازی وی‌پی‌ان مسدودکننده</string>
+ <string name="void_vpn_stopped">مسدودکردن تمام ترافیک خروجی اینترنت متوقف شد.</string>
+ <string name="void_vpn_title">مسدود کردن ترافیک</string>
+ <string name="update_provider_details">به‌روز رسانی اطلاعات ارائه‌دهنده</string>
+ <string name="update_certificate">به‌روز رسانی گواهی </string>
+ <string name="warning_eip_json_corrupted">ناموفق در به‌روز رسانی تنظیمات ارا‌ئه‌دهنده</string>
+ <string name="eip_json_corrupted_user_message">ناموفق در به‌روز رسانی تنظیمات ارا‌ئه‌دهنده. برای تلاش مجدد، لطفا دوباره وارد شوید.</string>
+ <string name="warning_corrupted_provider_details">گواهی ارائه‌دهنده ذخیره‌شده خراب است. یا بیتمسک را به‌روز رسانی کنید (گزینه پیشنهادی)، و یا اطلاعات ارائه‌دهنده را با استفاده از گواهی تجاری CA به‌روز رسانی کنید.</string>
+ <string name="warning_corrupted_provider_cert">گواهی ارائه‌دهنده ذخیره‌شده نامعتبر است. یا بیتمسک را به‌روز رسانی کنید (گزینه پیشنهادی)، و یا گواهی ارائه‌دهنده را با استفاده از گواهی تجاری CA به‌روز رسانی کنید.</string>
+ <string name="warning_expired_provider_cert"> گواهی ارائه‌دهنده ذخیره‌شده تاریخ‌گذشته است. یا بیتمسک را به‌روز رسانی کنید (گزینه پیشنهادی)، و یا گواهی ارائه‌دهنده را با استفاده از گواهی تجاری CA به‌روز رسانی کنید.</string>
+ <string name="downloading_vpn_certificate_failed">ناموفق در دریافت گواهی وی‌پی‌ان. لطفا دوباره تلاش کنید و یا ارائه‌دهنده دیگری را انتخاب کنید.</string>
+ <string name="vpn_certificate_is_invalid">گواهی وی‌پی‌ان نامعتبر است. تلاش کنید که گواهی جدیدی دریافت کنید.</string>
+ <string name="vpn_certificate_user_message">گواهی وی‌پی‌ان نامعتبر است. لطفا برای دریافت گواهی جدید وارد شوید. </string>
</resources>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index e1133837..3a668286 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -16,15 +16,20 @@
<string name="status_unknown">État inconnu.</string>
<string name="eip_service_label">Accès à Internet par RPV chiffré</string>
<string name="configuration_wizard_title">Choisir un fournisseur de services</string>
+ <string name="add_provider">Ajouter un nouveau fournisseur</string>
<string name="introduce_new_provider">Ajouter un nouveau fournisseur de services</string>
<string name="save">Enregistrer</string>
<string name="new_provider_uri">Nom de domaine</string>
<string name="valid_url_entered">Cette URL est valide</string>
<string name="not_valid_url_entered">URL malformée</string>
+ <string name="provider_details_title">Renseignements sur le fournisseur</string>
<string name="use_anonymously_button">Utiliser anonymement</string>
<string name="username_hint">nom d’utilisateur</string>
<string name="username_ask">Veuillez saisir votre nom d’utilisateur</string>
+ <string name="password_ask">Veuillez saisir votre mot de passe</string>
<string name="password_hint">mot de passe</string>
+ <string name="password_match">Les mots de passe correspondent</string>
+ <string name="password_mismatch">Les mots de passe ne correspondent pas</string>
<string name="user_message">Message utilisateur</string>
<string name="about_fragment_title">À propos</string>
<string name="error_srp_math_error_user_message">Ressayer : erreur mathématique du serveur.</string>
@@ -82,6 +87,10 @@
<string name="vpn_securely_routed">Votre trafic est acheminé en toute sécurité par :</string>
<string name="bitmask_log">Journal Bitmask</string>
<string name="title_activity_main">Bitmask</string>
+ <string name="log_fragment_title">Journal</string>
+ <string name="vpn_fragment_title">RPV</string>
+ <string name="navigation_drawer_open">Ouvrir le tiroir de navigation</string>
+ <string name="navigation_drawer_close">Fermer le tiroir de navigation</string>
<string name="action_example">Exemple d’action</string>
<string name="action_settings">Paramètres</string>
<string name="void_vpn_establish">Bitmask bloque tout le trafic Internet sortant.</string>
@@ -90,7 +99,14 @@
<string name="void_vpn_title">Blocage du trafic</string>
<string name="update_provider_details">Mettre les renseignements de fournisseur à jour</string>
<string name="update_certificate">Mettre le certificat à jour</string>
+ <string name="warning_eip_json_corrupted">Échec de mise à jour de la configuration du fournisseur.</string>
+ <string name="eip_json_corrupted_user_message">Échec de mise à jour de la configuration du fournisseur. Veuillez vous connecter pour ressayer.</string>
<string name="warning_corrupted_provider_details">Les renseignements de fournisseur enregistrés sont corrompus. Vous pouvez soit mettre Bitmask à jour (recommandé), soit mettre les renseignements de fournisseur à jour en utilisant un certificat CA commercial.</string>
<string name="warning_corrupted_provider_cert">Le certificat de fournisseur enregistré est invalide. Vous pouvez soit mettre Bitmask à jour (recommandé), soit mettre le certificat de fournisseur à jour en utilisant un certificat CA commercial.</string>
<string name="warning_expired_provider_cert">Le certificat de fournisseur enregistré est expiré. Vous pouvez soit mettre Bitmask à jour (recommandé), soit mettre le certificat de fournisseur à jour en utilisant un certificat CA commercial.</string>
+ <string name="downloading_vpn_certificate_failed">Échec de téléchargement du certificat du RPV. Ressayez ou choisissez un autre fournisseur.</string>
+ <string name="vpn_certificate_is_invalid">Le certificat du RPV est invalide. Essayez d’en télécharger un nouveau.</string>
+ <string name="vpn_certificate_user_message">Le certificat du RPV est invalide. Veuillez vous connecter pour en télécharger un nouveau.</string>
+ <string name="save_battery">Économiser la batterie</string>
+ <string name="save_battery_message">Les communications de données d’arrière-plan seront mises en veille quand votre téléphone sera inactif. Cette fonction est encore expérimentale.</string>
</resources>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 00000000..35c77f4f
--- /dev/null
+++ b/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,110 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="retry">Intentar de novo</string>
+ <string name="repository_url_text">Código fonte dispoñible en https://0xacab.org/leap/bitmask_android</string>
+ <string name="leap_tracker">Seguimento de incidencias en https://0xacab.org/leap/bitmask_android/issues</string>
+ <string name="translation_project_text">Agradécese a tradución. Aquí está o noso proxecto en Transifex https://www.transifex.com/projects/p/bitmask-android/</string>
+ <string name="switch_provider_menu_option">Cambiar provedor</string>
+ <string name="info">info</string>
+ <string name="show_connection_details">Mostrar detalles da conexión</string>
+ <string name="routes_info">Rutas: %s</string>
+ <string name="routes_info6">Rutas IPv6: %s</string>
+ <string name="error_empty_username">A caixa nome de usuaria non pode estar baldeira.</string>
+ <string name="cert_from_keystore">Obteña o certificado \'%s\' do almacén de chaves</string>
+ <string name="provider_label">Provedor:</string>
+ <string name="provider_label_none">Non hai provedor configurado</string>
+ <string name="status_unknown">Estado descoñecido.</string>
+ <string name="eip_service_label">Acceso a internet con VPN cifrado</string>
+ <string name="configuration_wizard_title">Escolla un provedor de acceso</string>
+ <string name="add_provider">Engadir novo provedor</string>
+ <string name="introduce_new_provider">Engadir novo provedor de servizo</string>
+ <string name="save">Gardar</string>
+ <string name="new_provider_uri">Nome de dominio</string>
+ <string name="valid_url_entered">O URL é válido</string>
+ <string name="not_valid_url_entered">URL mal formado</string>
+ <string name="provider_details_title">Detalles do provedor</string>
+ <string name="use_anonymously_button">Utilizar de xeito anónimo</string>
+ <string name="username_hint">nome de usuaria</string>
+ <string name="username_ask">Por favor introduza o seu nome de usuaria</string>
+ <string name="password_ask">Por favor introduza o seu contrasinal</string>
+ <string name="password_hint">contrasinal</string>
+ <string name="password_match">Os contrasinais concordan</string>
+ <string name="password_mismatch">Os contrasinais non concordan</string>
+ <string name="user_message">Mensaxe de usuaria</string>
+ <string name="about_fragment_title">Sobre</string>
+ <string name="error_srp_math_error_user_message">Inténtar de novo: Fallo no servidor.</string>
+ <string name="error_bad_user_password_user_message">Nome de usuaria ou contrasinal incorrectos.</string>
+ <string name="error_not_valid_password_user_message">Cando menos debe ter 8 caracteres.</string>
+ <string name="error_client_http_user_message">Intentar de novo: Fallo no cliente HTTP</string>
+ <string name="error_io_exception_user_message">Intentar de novo: fallo I/O</string>
+ <string name="error_json_exception_user_message">Intentar de novo: resposta incorrecta desde o servidor</string>
+ <string name="error_no_such_algorithm_exception_user_message">Non se atopou algoritmo de cifrado. Por favor actualice Android!</string>
+ <string name="signup_or_login_button">Conexión/Rexistro</string>
+ <string name="login_button">Conectar</string>
+ <string name="login_to_profile">Conectar perfil</string>
+ <string name="logout_button">Desconectar</string>
+ <string name="signup_button">Rexistro</string>
+ <string name="create_profile">Crear perfil</string>
+ <string name="setup_provider">Establecer provedor</string>
+ <string name="setup_error_title">Fallo na configuración</string>
+ <string name="setup_error_configure_button">Configurar</string>
+ <string name="setup_error_close_button">Saír</string>
+ <string name="setup_error_text">Algo fallou ao configurar Bitmask co provedor escollido.\n\nPode escoller reconfigurar ou saír e configurar un provedor no seguinte inicio.</string>
+ <string name="server_unreachable_message">Non se puido conectar ao servidor, por favor inténteo de novo.</string>
+ <string name="error.security.pinnedcertificate">Fallo de seguridade, anove o aplicativo ou escolla outro provedor</string>
+ <string name="malformed_url">Non semella ser un provedor Bitmask.</string>
+ <string name="certificate_error">Este non é un provedor de confianza de Bitmask</string>
+ <string name="service_is_down_error">O servizo está caído.</string>
+ <string name="configuring_provider">Configurando provedor</string>
+ <string name="incorrectly_downloaded_certificate_message">Non se descargou o seu certificado de anonimato</string>
+ <string name="downloading_certificate_message">Descargando certificado VPN</string>
+ <string name="updating_certificate_message">Anovando certificado VPN</string>
+ <string name="login.riseup.warning">As usuarias de Riseup precisarán crear unha conta separada para utilizar o servizo VPN</string>
+ <string name="succesful_authentication_message">Autenticada.</string>
+ <string name="authentication_failed_message">Fallo na autenticación.</string>
+ <string name="registration_failed_message">Fallo no rexistro</string>
+ <string name="eip_status_start_pending">Iniciando conexión</string>
+ <string name="eip_cancel_connect_title">Cancelar a conexión?</string>
+ <string name="eip_cancel_connect_text">Hai un intento de conexión en proceso. Desexa cancelalo?</string>
+ <string name="eip.warning.browser_inconsistency">Apagar a conexión VPN? Si está desconectada a VPN podería suministrar información personal ao seu provedor de acceso a internet ou rede local.</string>
+ <string name="eip_state_not_connected">Non está a conectada! Conexión insegura!</string>
+ <string name="eip_state_connected">Conexión segura.</string>
+ <string name="provider_problem">Semella que hai un problema co provedor.</string>
+ <string name="try_another_provider">Por favor, inténteo con un novo provedor ou contacte co seu.</string>
+ <string name="default_username">Anónimo</string>
+ <string name="logged_in_user_status">está conectada.</string>
+ <string name="logged_out_user_status">desconectada.</string>
+ <string name="didnt_log_out_user_status">non se desconectou. Inténteo máis tarde, podería haber un problema na rede ou co provedor. Si persiste o problema, borre os datos de Bitmask nos axustes de Android.</string>
+ <string name="not_logged_in_user_status">non se ten conectado.</string>
+ <string name="logging_in_user_status">está a conectar.</string>
+ <string name="logging_in">Conectando</string>
+ <string name="signing_up">Rexistrando</string>
+ <string name="logging_out_user_status">está a desconectar.</string>
+ <string name="signingup_message">está sendo rexistrada.</string>
+ <string name="vpn.button.turn.on">Acender</string>
+ <string name="vpn.button.turn.off">Apagar</string>
+ <string name="vpn_button_turn_off_blocking">Deixar de bloquear</string>
+ <string name="vpn_securely_routed">O seu tráfico está securizado a través de:</string>
+ <string name="bitmask_log">Rexistro Bitmask</string>
+ <string name="title_activity_main">Bitmask</string>
+ <string name="log_fragment_title">Rexistro</string>
+ <string name="vpn_fragment_title">VPN</string>
+ <string name="navigation_drawer_open">Abrir cadro de navegación</string>
+ <string name="navigation_drawer_close">Pechar cadro de navegación</string>
+ <string name="action_example">Acción de exemplo</string>
+ <string name="action_settings">Axustes</string>
+ <string name="void_vpn_establish">Bitmask bloquea todo o tráfico saínte a internet.</string>
+ <string name="void_vpn_error_establish">Fallo ao establecer bloqueo VPN.</string>
+ <string name="void_vpn_stopped">Deixou de bloquear todo o tráfico saínte.</string>
+ <string name="void_vpn_title">Bloqueando tráfico</string>
+ <string name="update_provider_details">Actualizar detalles do provedor</string>
+ <string name="update_certificate">Anovar certificado</string>
+ <string name="warning_eip_json_corrupted">Fallo ao anovar a configuración do provedor.</string>
+ <string name="eip_json_corrupted_user_message">Fallo ao anovar a configuración do provedor. Por favor conéctese para intentalo de novo.</string>
+ <string name="warning_corrupted_provider_details">Os datos do provedor gardados son defectuosos. Pode actualizar Bitmask (recomendado) ou ben actualizar os detalles do provedor utilizando un certificado CA de confianza.</string>
+ <string name="warning_corrupted_provider_cert">O certificado de provedor gardado non é válido. Pode actualizar Bitmask (recomendado) ou actualizar o certificado do provedor utilizando un certificado CA comercial.</string>
+ <string name="warning_expired_provider_cert">O certificado do provedor gardado caducou. Pode actualizar Bitmask (recomendado) ou pode actualizar o certificado do provedor utilizando un certificado CA comercial.</string>
+ <string name="downloading_vpn_certificate_failed">Fallou a descarga do certificado do VPN. Inténteo de novo ou escolla outro provedor.</string>
+ <string name="vpn_certificate_is_invalid">O certificado do VPN non é válido. Intente descargar un novo.</string>
+ <string name="vpn_certificate_user_message">O certificado VPN non é válido. Por favor conéctese para descargar un novo.</string>
+</resources>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 0d8b85a6..b17ac66d 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -3,39 +3,112 @@
<string name="retry">Opnieuw proberen</string>
<string name="repository_url_text">Broncode is beschikbaar op https://0xacab.org/leap/bitmask_android</string>
<string name="leap_tracker">Issue tracker https://0xacab.org/leap/bitmask_android/issues</string>
+ <string name="translation_project_text">Vertalingen zijn welkom en worden gewaardeerd. Kijk voor meer info op onze Transifex pagina: https://www.transifex.com/projects/p/bitmask-android/</string>
<string name="switch_provider_menu_option">Provider wisselen</string>
<string name="info">info</string>
<string name="show_connection_details">Details van de verbinding weergeven</string>
<string name="routes_info">Routes: %s</string>
+ <string name="routes_info6">IPv6 routes: %s</string>
<string name="error_empty_username">De gebruikersnaam moet niet leeg zijn.</string>
+ <string name="cert_from_keystore">Kreeg certificaat \'%s\' van de keystore</string>
<string name="provider_label">Provider:</string>
<string name="provider_label_none">Geen provider ingesteld</string>
<string name="status_unknown">Status onbekend</string>
+ <string name="eip_service_label">VPN Versleutelde Internet Toegang</string>
+ <string name="configuration_wizard_title">Service provider selecteren</string>
+ <string name="add_provider">Nieuwe provider toevoegen</string>
<string name="introduce_new_provider">Nieuwe serviceprovider toevoegen</string>
<string name="save">Opslaan</string>
<string name="new_provider_uri">Domeinnaam</string>
+ <string name="valid_url_entered">De URL is correct</string>
+ <string name="not_valid_url_entered">Incorrecte URL</string>
+ <string name="provider_details_title">Provider details</string>
<string name="use_anonymously_button">Anoniem gebruiken</string>
<string name="username_hint">gebruikersnaam</string>
<string name="username_ask">Geef je gebruikersnaam in</string>
+ <string name="password_ask">Voer je wachtwoord in</string>
<string name="password_hint">wachtwoord</string>
+ <string name="password_match">Wachtwoorden komen overeen</string>
+ <string name="password_mismatch">Wachtwoorden komen niet overeen</string>
<string name="user_message">Bericht</string>
+ <string name="about_fragment_title">Over</string>
+ <string name="error_srp_math_error_user_message">Probeer opnieuw: serverrekenfout.</string>
<string name="error_bad_user_password_user_message">Gebruikersnaam of wachtwoord verkeerd.</string>
+ <string name="error_not_valid_password_user_message">Wachtwoord moet minstens 8 tekens bevatten.</string>
<string name="error_client_http_user_message">Probeer opnieuw: Client HTTP fout</string>
<string name="error_io_exception_user_message">Probeer opnieuw: I/O fout</string>
<string name="error_json_exception_user_message">Probeer opnieuw: incorrect antwoord van de server</string>
+ <string name="error_no_such_algorithm_exception_user_message">Coderingsalgoritme niet gevonden. Gelieve Android te upgraden!</string>
+ <string name="signup_or_login_button">Inschrijven/Inloggen</string>
<string name="login_button">Aanmelden</string>
+ <string name="login_to_profile">Login voor profiel</string>
<string name="logout_button">Afmelden</string>
+ <string name="signup_button">Registreer</string>
+ <string name="create_profile">Creeer profiel</string>
+ <string name="setup_provider">Setup provider</string>
<string name="setup_error_title">Configuratiefout</string>
<string name="setup_error_configure_button">Configureren</string>
<string name="setup_error_close_button">Aflsluiten</string>
+ <string name="setup_error_text">Er is een probleem opgetreden om Bitmask te configureren met jou provider.
+
+Je kan kiezen om te herconfigureren of af te sluiten en bij de volgende start een provider in te stellen.</string>
+ <string name="server_unreachable_message">Server is onbereikbaar, probeer later opnieuw.</string>
+ <string name="error.security.pinnedcertificate">Beveiligingsprobleem, upgrade de app of kies een andere provider.</string>
<string name="malformed_url">Dit lijkt geen Bitmask provider te zijn.</string>
<string name="certificate_error">Dit is geen vertrouwde Bitmask provider.</string>
+ <string name="service_is_down_error">Service is onbereikbaar.</string>
<string name="configuring_provider">Provider wordt ingesteld</string>
<string name="incorrectly_downloaded_certificate_message">Je anonieme certificaat is niet gedownload</string>
+ <string name="downloading_certificate_message">Downloading VPN certificaat</string>
+ <string name="updating_certificate_message">Updaten VPN certificaat</string>
+ <string name="login.riseup.warning">Riseup gebruikers moeten een apart account aanmaken om de VPN service te gebruiken</string>
+ <string name="succesful_authentication_message">Geauthenticeerd.</string>
<string name="authentication_failed_message">Authenticatie mislukt.</string>
+ <string name="registration_failed_message">Registratie mislukt.</string>
<string name="eip_status_start_pending">Verbinding wordt geïnitialiseerd</string>
<string name="eip_cancel_connect_title">Verbinding annuleren?</string>
<string name="eip_cancel_connect_text">We proberen een verbinding tot stand te brengen. Wil je dit annuleren?</string>
+ <string name="eip.warning.browser_inconsistency">VPN verbinding uitzetten? Wanneer de VPN uitstaat, kan je persoonlijke data lekken naar je internet provider of je lokale netwerk.</string>
+ <string name="eip_state_not_connected">Uitgeschakeld! Onbeveiligde verbinding!</string>
<string name="eip_state_connected">Verbinding beveiligd.</string>
+ <string name="provider_problem">Het lijkt er op dat er een probleem is met de provider.</string>
+ <string name="try_another_provider">Gelieve een andere provider te proberen of contacteer je huidige.</string>
+ <string name="default_username">Anoniem</string>
+ <string name="logged_in_user_status">is ingelogd.</string>
+ <string name="logged_out_user_status">is uitgelogd.</string>
+ <string name="didnt_log_out_user_status">niet uitgelogd. Probeer het later, er kan een probleem zijn met het netwerk of de provider. Als het probleem zich blijft voordoen, verwijder dan de Bitmask data uit de Android settings.</string>
+ <string name="not_logged_in_user_status">heeft zich niet ingelogd.</string>
+ <string name="logging_in_user_status">wordt aangemeld.</string>
+ <string name="logging_in">Aanmelden</string>
+ <string name="signing_up">Sign up</string>
+ <string name="logging_out_user_status">wordt uitgelogd.</string>
+ <string name="signingup_message">wordt geregistreerd.</string>
+ <string name="vpn.button.turn.on">Aanzetten</string>
+ <string name="vpn.button.turn.off">Uitschakelen</string>
+ <string name="vpn_button_turn_off_blocking">Stop blokkeren</string>
+ <string name="vpn_securely_routed">Je verkeer wordt veilig geroute door:</string>
+ <string name="bitmask_log">Bitmask Log</string>
+ <string name="title_activity_main">Bitmask</string>
+ <string name="log_fragment_title">Log</string>
+ <string name="vpn_fragment_title">VPN</string>
+ <string name="navigation_drawer_open">Open navigatiemenu</string>
+ <string name="navigation_drawer_close">Sluit navigatiemenu</string>
+ <string name="action_example">Voorbeeld</string>
+ <string name="action_settings">Instellingen</string>
+ <string name="void_vpn_establish">Bitmaks blokkert alle uitgaande internetverkeer.</string>
+ <string name="void_vpn_error_establish">Niet gelukt om een blokkerende VPN op te zetten.</string>
+ <string name="void_vpn_stopped">Gestopt met blokkkeren van alle uitgaande internetverkeer.</string>
+ <string name="void_vpn_title">Blokkeert verkeer</string>
+ <string name="update_provider_details">Update provider details</string>
<string name="update_certificate">Update certificaat</string>
+ <string name="warning_eip_json_corrupted">Updaten providerconfiguratie mislukt</string>
+ <string name="eip_json_corrupted_user_message">Updaten providerconfiguratie mislukt. Login of probeer opnieuw.</string>
+ <string name="warning_corrupted_provider_details">Opgeslagen providerdetails zijn corrupt. Je kan Bitmask updaten (aanbevolen) of de provider details updaten met een commercieel CA-certificaat.</string>
+ <string name="warning_corrupted_provider_cert">Opgeslagen providercertificaat is ongeldig. Je kan Bitmask updaten (aanbevolen) of het provider certificaat updaten met een commercieel CA-certificaat.</string>
+ <string name="warning_expired_provider_cert">Opgeslagen providercertificaat is verlopen. Je kan Bitmask updaten (aanbevolen) of het provider certificaat updaten met een commercieel CA-certificaat.</string>
+ <string name="downloading_vpn_certificate_failed">Downloaden van het VPN certificaat mislukt. Probeer opnieuw of kies een andere provider.</string>
+ <string name="vpn_certificate_is_invalid">VPN certificaat is ongeldig. Probeer een nieuw te downloaden.</string>
+ <string name="vpn_certificate_user_message">Het VPN certificaat in ongeldig. Gelieve opnieuw in te loggen om een nieuw te downloaden.</string>
+ <string name="save_battery">Batterij besparen</string>
+ <string name="save_battery_message">Achtergrond dataverbindingen worden in slaapstand gezet wanneer uw telefoon inactief is. Deze functionaliteit is nog experimenteel.</string>
</resources>
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index 42a03df0..1e825b9d 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -99,7 +99,12 @@
<string name="void_vpn_title">Blokkerer trafikk</string>
<string name="update_provider_details">Oppdater tilbyderdetaljer</string>
<string name="update_certificate">Oppdater sertifikat</string>
+ <string name="warning_eip_json_corrupted">Oppdatering av tilbyderoppsett mislyktes</string>
+ <string name="eip_json_corrupted_user_message">Oppdatering av tilbyderoppsett mislyktes. Logg inn og prøv igjen.</string>
<string name="warning_corrupted_provider_details">De lagrede tilbyderdetaljene er skadet. Du kan enten oppdatere Bitmask (anbefalt) eller oppdatere tilbyderdetaljene til å bruke et kommersielt CA-sertifikat.</string>
<string name="warning_corrupted_provider_cert">Lagret tilbydersertifikat er ugyldig. Du kan enten oppdatere Bitmask (anbefalt) eller oppdatere tilbydersertifikatet til å bruke et kommersielt CA-sertifikat.</string>
<string name="warning_expired_provider_cert">Det lagrede tilbydersertifikatet er utløpt. Du kan enten oppdatere Bitmask (anbefalt) eller oppdatere tilbydersertifikatet til å bruke et kommersielt CA-sertifikat.</string>
+ <string name="downloading_vpn_certificate_failed">Nedlasting av VPN-sertifikat mislyktes. Prøv igjen eller velg en annen tilbyder.</string>
+ <string name="vpn_certificate_is_invalid">VPN-sertifikatet er ugyldig. Prøv å laste ned et nytt et.</string>
+ <string name="vpn_certificate_user_message">VPN-sertifikatet er ugyldig. Logg inn for å laste ned et nytt et.</string>
</resources>
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index b810af61..70efcd9d 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -9,6 +9,7 @@
<string name="new_provider_uri">Назва домена</string>
<string name="username_hint">ім\'я користувача</string>
<string name="password_hint">пароль</string>
+ <string name="about_fragment_title">Про</string>
<string name="login_button">Вхід у систему</string>
<string name="setup_error_configure_button">Налаштування</string>
<string name="setup_error_close_button">Вихід</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2c191afa..71b6d437 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -108,4 +108,6 @@
<string name="downloading_vpn_certificate_failed">Downloading the VPN certificate failed. Try again or choose another provider.</string>
<string name="vpn_certificate_is_invalid">VPN certificate is invalid. Try to download a new one.</string>
<string name="vpn_certificate_user_message">The VPN certificate is invalid. Please log in to download a new one.</string>
+ <string name="save_battery">Save battery</string>
+ <string name="save_battery_message">Background data connections will hibernate when your phone is inactive. This feature is still experimental.</string>
</resources>
diff --git a/app/src/main/res/values/untranslatable.xml b/app/src/main/res/values/untranslatable.xml
index 59605609..2e91366a 100644
--- a/app/src/main/res/values/untranslatable.xml
+++ b/app/src/main/res/values/untranslatable.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="notifcation_title_bitmask">Bitmask - %s</string>
-
- <string name="copyright_leapgui" translatable="false">Copyright 2012-2017\nLEAP Encryption Access Project &lt;info@leap.se></string>
+ <string name="copyright_leapgui" translatable="false">Copyright 2012-2018\nLEAP Encryption Access Project &lt;info@leap.se></string>
<string name="opevpn_copyright" translatable="false">Copyright © 2002–2010 OpenVPN Technologies, Inc. &lt;sales@openvpn.net>\n
"OpenVPN" is a trademark of OpenVPN Technologies, Inc.</string>
<string name="lzo_copyright" translatable="false">Copyright © 1996 – 2011 Markus Franz Xaver Johannes Oberhumer</string>
@@ -15,20 +14,21 @@
<string name="openvpn" translatable="false">OpenVPN</string>
<string name="lzo" translatable="false">LZO</string>
<string name="openssl" translatable="false">OpenSSL</string>
+ <string name="mbetTLS" translatable="false">Mbed TLS</string>
+ <string name="copyright_mbetTLS" translatable="false">Unless specifically indicated otherwise in a file, files are licensed under the Apache 2.0 license, as can be found in: apache-2.0.txt. \n
+ https://github.com/schwabe/polarssl/blob/icsopenvpn_270/apache-2.0.txt
+ </string>
+ <string name="asio">Asio</string>
+ <string name="copyright_asio">Boost Software License - Version 1.0 - August 17th, 2003</string>
+ <string name="openvpn3">OpenVPN 3</string>
+ <string name="copyright_openvpn3">GNU AFFERO GENERAL PUBLIC LICENSE\n
+ Version 3, 19 November 2007</string>
<string name="unknown_state" translatable="false">Unknown state</string>
-
<string name="copyright_blinktgui" translatable="false">Copyright 2012–2017 Arne Schwabe &lt;arne@rfc2549.org></string>
-
<string name="defaultserver" translatable="false">openvpn.uni-paderborn.de</string>
<string name="defaultport" translatable="false">1194</string>
<string name="copyright_file_dialog" translatable="false">File Dialog based on work by Alexander Ponomarev</string>
-
-
-
<string name="file_dialog" translatable="false">File Dialog</string>
-
-
-
<string name="permission_description">Allows another app to control OpenVPN</string>
<string name="bouncy_castle" translatable="false">Bouncy Castle Crypto APIs</string>
<string name="copyright_bouncycastle" translatable="false">Copyright © 2000–2012 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)</string>