mirror of
https://github.com/yggdrasil-network/yggdrasil-android.git
synced 2025-06-16 14:15:09 +03:00
Changed DNS configuration UI. Disabled DNS config by default. Added DNS fix for Chrome-based browsers.
This commit is contained in:
parent
dd67347cd8
commit
fdd0b7955b
6 changed files with 275 additions and 25 deletions
|
@ -12,7 +12,8 @@ import android.widget.*
|
||||||
import com.google.android.material.textfield.TextInputEditText
|
import com.google.android.material.textfield.TextInputEditText
|
||||||
|
|
||||||
const val KEY_DNS_SERVERS = "dns_servers"
|
const val KEY_DNS_SERVERS = "dns_servers"
|
||||||
const val DEFAULT_DNS_SERVERS = "302:7991::53,302:db60::53,300:6223::53"
|
const val KEY_ENABLE_CHROME_FIX = "enable_chrome_fix"
|
||||||
|
const val DEFAULT_DNS_SERVERS = "302:7991::53,302:db60::53,300:6223::53,301:1088::53"
|
||||||
|
|
||||||
class DnsActivity : AppCompatActivity() {
|
class DnsActivity : AppCompatActivity() {
|
||||||
private lateinit var config: ConfigurationProxy
|
private lateinit var config: ConfigurationProxy
|
||||||
|
@ -20,7 +21,10 @@ class DnsActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var serversTableLayout: TableLayout
|
private lateinit var serversTableLayout: TableLayout
|
||||||
private lateinit var serversTableLabel: TextView
|
private lateinit var serversTableLabel: TextView
|
||||||
|
private lateinit var serversTableHint: TextView
|
||||||
private lateinit var addServerButton: ImageButton
|
private lateinit var addServerButton: ImageButton
|
||||||
|
private lateinit var enableChromeFix: Switch
|
||||||
|
|
||||||
private lateinit var servers: MutableList<String>
|
private lateinit var servers: MutableList<String>
|
||||||
private lateinit var preferences: SharedPreferences
|
private lateinit var preferences: SharedPreferences
|
||||||
|
|
||||||
|
@ -34,41 +38,52 @@ class DnsActivity : AppCompatActivity() {
|
||||||
|
|
||||||
serversTableLayout = findViewById(R.id.configuredDnsTableLayout)
|
serversTableLayout = findViewById(R.id.configuredDnsTableLayout)
|
||||||
serversTableLabel = findViewById(R.id.configuredDnsLabel)
|
serversTableLabel = findViewById(R.id.configuredDnsLabel)
|
||||||
|
serversTableHint = findViewById(R.id.configuredDnsHint)
|
||||||
|
enableChromeFix = findViewById(R.id.enableChromeFix)
|
||||||
|
|
||||||
addServerButton = findViewById(R.id.addServerButton)
|
addServerButton = findViewById(R.id.addServerButton)
|
||||||
addServerButton.setOnClickListener {
|
addServerButton.setOnClickListener {
|
||||||
val view = inflater.inflate(R.layout.dialog_add_dns_server, null)
|
val view = inflater.inflate(R.layout.dialog_add_dns_server, null)
|
||||||
val input = view.findViewById<TextInputEditText>(R.id.addDnsInput)
|
val input = view.findViewById<TextInputEditText>(R.id.addDnsInput)
|
||||||
val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(this, R.style.Theme_MaterialComponents_DayNight_Dialog))
|
val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(this, R.style.Theme_MaterialComponents_DayNight_Dialog))
|
||||||
builder.setTitle("Add DNS server")
|
builder.setTitle(getString(R.string.dns_add_server_dialog_title))
|
||||||
builder.setView(view)
|
builder.setView(view)
|
||||||
builder.setPositiveButton("Add") { dialog, _ ->
|
builder.setPositiveButton(getString(R.string.add)) { dialog, _ ->
|
||||||
servers.add(input.text.toString())
|
servers.add(input.text.toString())
|
||||||
preferences.edit().apply {
|
preferences.edit().apply {
|
||||||
this.putString(KEY_DNS_SERVERS, servers.joinToString(","))
|
putString(KEY_DNS_SERVERS, servers.joinToString(","))
|
||||||
this.commit()
|
commit()
|
||||||
}
|
}
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
updateConfiguredServers()
|
updateConfiguredServers()
|
||||||
}
|
}
|
||||||
builder.setNegativeButton("Cancel") { dialog, _ ->
|
builder.setNegativeButton(getString(R.string.cancel)) { dialog, _ ->
|
||||||
dialog.cancel()
|
dialog.cancel()
|
||||||
}
|
}
|
||||||
builder.show()
|
builder.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
|
enableChromeFix.setOnCheckedChangeListener { _, isChecked ->
|
||||||
val serverString = preferences.getString(KEY_DNS_SERVERS, DEFAULT_DNS_SERVERS)
|
preferences.edit().apply {
|
||||||
if (serverString!!.isNotEmpty()) {
|
putBoolean(KEY_ENABLE_CHROME_FIX, isChecked)
|
||||||
servers = serverString.split(",").toMutableList()
|
commit()
|
||||||
} else {
|
|
||||||
servers = mutableListOf()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
|
||||||
|
val serverString = preferences.getString(KEY_DNS_SERVERS, "")
|
||||||
|
servers = if (serverString!!.isNotEmpty()) {
|
||||||
|
serverString.split(",").toMutableList()
|
||||||
|
} else {
|
||||||
|
mutableListOf()
|
||||||
|
}
|
||||||
|
updateUsableServers()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
updateConfiguredServers()
|
updateConfiguredServers()
|
||||||
|
enableChromeFix.isChecked = preferences.getBoolean(KEY_ENABLE_CHROME_FIX, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("ApplySharedPref")
|
@SuppressLint("ApplySharedPref")
|
||||||
|
@ -76,23 +91,25 @@ class DnsActivity : AppCompatActivity() {
|
||||||
when (servers.size) {
|
when (servers.size) {
|
||||||
0 -> {
|
0 -> {
|
||||||
serversTableLayout.visibility = View.GONE
|
serversTableLayout.visibility = View.GONE
|
||||||
serversTableLabel.text = "No servers configured"
|
serversTableLabel.text = getString(R.string.dns_no_configured_servers)
|
||||||
|
serversTableHint.text = getText(R.string.dns_configured_servers_hint_empty)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
serversTableLayout.visibility = View.VISIBLE
|
serversTableLayout.visibility = View.VISIBLE
|
||||||
serversTableLabel.text = "Configured servers"
|
serversTableLabel.text = getString(R.string.dns_configured_servers)
|
||||||
|
serversTableHint.text = getText(R.string.dns_configured_servers_hint)
|
||||||
|
|
||||||
serversTableLayout.removeAllViewsInLayout()
|
serversTableLayout.removeAllViewsInLayout()
|
||||||
for (i in servers.indices) {
|
for (i in servers.indices) {
|
||||||
val peer = servers[i]
|
val server = servers[i]
|
||||||
val view = inflater.inflate(R.layout.peers_configured, null)
|
val view = inflater.inflate(R.layout.peers_configured, null)
|
||||||
view.findViewById<TextView>(R.id.addressValue).text = peer
|
view.findViewById<TextView>(R.id.addressValue).text = server
|
||||||
view.findViewById<ImageButton>(R.id.deletePeerButton).tag = i
|
view.findViewById<ImageButton>(R.id.deletePeerButton).tag = i
|
||||||
|
|
||||||
view.findViewById<ImageButton>(R.id.deletePeerButton).setOnClickListener { button ->
|
view.findViewById<ImageButton>(R.id.deletePeerButton).setOnClickListener { button ->
|
||||||
val builder: AlertDialog.Builder = AlertDialog.Builder(this)
|
val builder: AlertDialog.Builder = AlertDialog.Builder(this)
|
||||||
builder.setTitle("Remove ${peer}?")
|
builder.setTitle("Remove ${server}?")
|
||||||
builder.setPositiveButton("Remove") { dialog, _ ->
|
builder.setPositiveButton(getString(R.string.remove)) { dialog, _ ->
|
||||||
servers.removeAt(button.tag as Int)
|
servers.removeAt(button.tag as Int)
|
||||||
preferences.edit().apply {
|
preferences.edit().apply {
|
||||||
this.putString(KEY_DNS_SERVERS, servers.joinToString(","))
|
this.putString(KEY_DNS_SERVERS, servers.joinToString(","))
|
||||||
|
@ -101,7 +118,7 @@ class DnsActivity : AppCompatActivity() {
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
updateConfiguredServers()
|
updateConfiguredServers()
|
||||||
}
|
}
|
||||||
builder.setNegativeButton("Cancel") { dialog, _ ->
|
builder.setNegativeButton(getString(R.string.cancel)) { dialog, _ ->
|
||||||
dialog.cancel()
|
dialog.cancel()
|
||||||
}
|
}
|
||||||
builder.show()
|
builder.show()
|
||||||
|
@ -111,4 +128,39 @@ class DnsActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ApplySharedPref")
|
||||||
|
private fun updateUsableServers() {
|
||||||
|
val usableTableLayout: TableLayout = findViewById(R.id.usableDnsTableLayout)
|
||||||
|
val defaultServers = DEFAULT_DNS_SERVERS.split(",")
|
||||||
|
|
||||||
|
defaultServers.forEach {
|
||||||
|
val server = it
|
||||||
|
val view = inflater.inflate(R.layout.dns_server_usable, null)
|
||||||
|
view.findViewById<TextView>(R.id.serverValue).text = server
|
||||||
|
val addButton = view.findViewById<ImageButton>(R.id.addButton)
|
||||||
|
addButton.tag = server
|
||||||
|
|
||||||
|
addButton.setOnClickListener { button ->
|
||||||
|
servers.add(button.tag as String)
|
||||||
|
preferences.edit().apply {
|
||||||
|
this.putString(KEY_DNS_SERVERS, servers.joinToString(","))
|
||||||
|
this.commit()
|
||||||
|
}
|
||||||
|
updateConfiguredServers()
|
||||||
|
}
|
||||||
|
view.setOnLongClickListener {
|
||||||
|
val builder: AlertDialog.Builder = AlertDialog.Builder(this)
|
||||||
|
builder.setTitle(getString(R.string.dns_server_info_dialog_title))
|
||||||
|
builder.setMessage(getText(R.string.dns_server_info_revertron))
|
||||||
|
builder.setPositiveButton(getString(R.string.ok)) { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
builder.show()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
usableTableLayout.addView(view)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -105,7 +105,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
receiver, IntentFilter(PacketTunnelState.RECEIVER_INTENT)
|
receiver, IntentFilter(PacketTunnelState.RECEIVER_INTENT)
|
||||||
)
|
)
|
||||||
val preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
|
val preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
|
||||||
val serverString = preferences.getString(KEY_DNS_SERVERS, DEFAULT_DNS_SERVERS)
|
val serverString = preferences.getString(KEY_DNS_SERVERS, "")
|
||||||
if (serverString!!.isNotEmpty()) {
|
if (serverString!!.isNotEmpty()) {
|
||||||
val servers = serverString.split(",")
|
val servers = serverString.split(",")
|
||||||
dnsLabel.text = when (servers.size) {
|
dnsLabel.text = when (servers.size) {
|
||||||
|
|
|
@ -100,7 +100,7 @@ class PacketTunnelProvider: VpnService() {
|
||||||
}
|
}
|
||||||
|
|
||||||
val preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
|
val preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
|
||||||
val serverString = preferences.getString(KEY_DNS_SERVERS, DEFAULT_DNS_SERVERS)
|
val serverString = preferences.getString(KEY_DNS_SERVERS, "")
|
||||||
if (serverString!!.isNotEmpty()) {
|
if (serverString!!.isNotEmpty()) {
|
||||||
val servers = serverString.split(",")
|
val servers = serverString.split(",")
|
||||||
if (servers.isNotEmpty()) {
|
if (servers.isNotEmpty()) {
|
||||||
|
@ -110,6 +110,9 @@ class PacketTunnelProvider: VpnService() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (preferences.getBoolean(KEY_ENABLE_CHROME_FIX, false)) {
|
||||||
|
builder.addRoute("2001:4860:4860::8888", 128)
|
||||||
|
}
|
||||||
|
|
||||||
parcel = builder.establish()
|
parcel = builder.establish()
|
||||||
val parcel = parcel
|
val parcel = parcel
|
||||||
|
@ -228,7 +231,7 @@ class PacketTunnelProvider: VpnService() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun reader() {
|
private fun reader() {
|
||||||
var b = ByteArray(65535)
|
val b = ByteArray(65535)
|
||||||
reads@ while (started.get()) {
|
reads@ while (started.get()) {
|
||||||
val readerStream = readerStream
|
val readerStream = readerStream
|
||||||
val readerThread = readerThread
|
val readerThread = readerThread
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="8pt"
|
android:layout_margin="8pt"
|
||||||
android:text="DNS"
|
android:text="@string/dns_activity_title"
|
||||||
android:textColor="?attr/textDefault"
|
android:textColor="?attr/textDefault"
|
||||||
android:textSize="24sp"
|
android:textSize="24sp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
android:layout_marginBottom="2pt"
|
android:layout_marginBottom="2pt"
|
||||||
android:alpha="0.7"
|
android:alpha="0.7"
|
||||||
android:paddingRight="8pt"
|
android:paddingRight="8pt"
|
||||||
android:text="DNS servers"
|
android:text=""
|
||||||
android:textAllCaps="true"
|
android:textAllCaps="true"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
android:textSize="12sp" />
|
android:textSize="12sp" />
|
||||||
|
@ -90,6 +90,57 @@
|
||||||
android:paddingBottom="2pt"
|
android:paddingBottom="2pt"
|
||||||
android:showDividers="middle" />
|
android:showDividers="middle" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/configuredDnsHint"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16pt"
|
||||||
|
android:layout_marginLeft="16pt"
|
||||||
|
android:layout_marginTop="4pt"
|
||||||
|
android:layout_marginEnd="8pt"
|
||||||
|
android:layout_marginRight="8pt"
|
||||||
|
android:layout_marginBottom="4pt"
|
||||||
|
android:alpha="0.7"
|
||||||
|
android:paddingRight="8pt"
|
||||||
|
android:text="@string/dns_configured_servers_hint"
|
||||||
|
android:textAllCaps="false"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/usableDnsLabel"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16pt"
|
||||||
|
android:layout_marginLeft="16pt"
|
||||||
|
android:layout_marginTop="8pt"
|
||||||
|
android:layout_marginEnd="8pt"
|
||||||
|
android:layout_marginRight="8pt"
|
||||||
|
android:layout_marginBottom="2pt"
|
||||||
|
android:alpha="0.7"
|
||||||
|
android:paddingRight="8pt"
|
||||||
|
android:text="@string/dns_usable_servers"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TableLayout
|
||||||
|
android:id="@+id/usableDnsTableLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8pt"
|
||||||
|
android:layout_marginLeft="8pt"
|
||||||
|
android:layout_marginEnd="8pt"
|
||||||
|
android:layout_marginRight="8pt"
|
||||||
|
android:background="@drawable/rounded"
|
||||||
|
android:divider="#46878787"
|
||||||
|
android:dividerPadding="4pt"
|
||||||
|
android:paddingLeft="4pt"
|
||||||
|
android:paddingTop="2pt"
|
||||||
|
android:paddingRight="4pt"
|
||||||
|
android:paddingBottom="2pt"
|
||||||
|
android:showDividers="middle" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -101,7 +152,87 @@
|
||||||
android:layout_marginBottom="4pt"
|
android:layout_marginBottom="4pt"
|
||||||
android:alpha="0.7"
|
android:alpha="0.7"
|
||||||
android:paddingRight="8pt"
|
android:paddingRight="8pt"
|
||||||
android:text="Yggdrasil will use these DNS servers in VPN config when service starts. All your DNS requests will be resolved through them."
|
android:text="@string/dns_usable_servers_hint"
|
||||||
|
android:textAllCaps="false"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="32px" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16pt"
|
||||||
|
android:layout_marginLeft="16pt"
|
||||||
|
android:layout_marginEnd="8pt"
|
||||||
|
android:layout_marginRight="8pt"
|
||||||
|
android:layout_marginBottom="2pt"
|
||||||
|
android:alpha="0.7"
|
||||||
|
android:paddingRight="8pt"
|
||||||
|
android:text="@string/dns_fixes"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TableLayout
|
||||||
|
android:id="@+id/fixesTableLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8pt"
|
||||||
|
android:layout_marginLeft="8pt"
|
||||||
|
android:layout_marginEnd="8pt"
|
||||||
|
android:layout_marginRight="8pt"
|
||||||
|
android:background="@drawable/rounded"
|
||||||
|
android:divider="#46878787"
|
||||||
|
android:dividerPadding="4pt"
|
||||||
|
android:paddingLeft="4pt"
|
||||||
|
android:paddingTop="2pt"
|
||||||
|
android:paddingRight="4pt"
|
||||||
|
android:paddingBottom="2pt"
|
||||||
|
android:showDividers="middle">
|
||||||
|
|
||||||
|
<TableRow
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clickable="true"
|
||||||
|
android:paddingStart="4pt"
|
||||||
|
android:paddingTop="2pt"
|
||||||
|
android:paddingEnd="4pt"
|
||||||
|
android:paddingBottom="4pt">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/dns_fix_chrome_based_browsers"
|
||||||
|
android:textColor="?attr/textDefault" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="2" />
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
android:id="@+id/enableChromeFix"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
</TableRow>
|
||||||
|
|
||||||
|
</TableLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16pt"
|
||||||
|
android:layout_marginLeft="16pt"
|
||||||
|
android:layout_marginTop="4pt"
|
||||||
|
android:layout_marginEnd="8pt"
|
||||||
|
android:layout_marginRight="8pt"
|
||||||
|
android:alpha="0.7"
|
||||||
|
android:paddingRight="8pt"
|
||||||
|
android:text="@string/dns_fix_chrome_based_browsers_hint"
|
||||||
android:textAllCaps="false"
|
android:textAllCaps="false"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
android:textSize="12sp" />
|
android:textSize="12sp" />
|
||||||
|
|
47
app/src/main/res/layout/dns_server_usable.xml
Normal file
47
app/src/main/res/layout/dns_server_usable.xml
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/tableRow"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/serverValue"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="18dp"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginEnd="18dp"
|
||||||
|
android:layout_marginBottom="12dp"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text=""
|
||||||
|
android:textColor="?attr/textDefault"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/addButton"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/space" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:id="@+id/space"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/addButton"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/addButton"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/serverValue"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/addButton" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/addButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="4dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_baseline_add_circle_24" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -1,3 +1,20 @@
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Yggdrasil</string>
|
<string name="app_name">Yggdrasil</string>
|
||||||
|
<string name="dns_configured_servers_hint">Yggdrasil will use these DNS servers in VPN config when service starts. All your DNS requests will be resolved by them.</string>
|
||||||
|
<string name="dns_configured_servers_hint_empty">Yggdrasil will not configure any DNS servers when service starts. All your DNS requests will be resolved by system resolver.</string>
|
||||||
|
<string name="dns_usable_servers_hint">These are DNS servers run by community members. Click plus button to add them to a list above. Long-tap to see more info.</string>
|
||||||
|
<string name="dns_no_configured_servers">No servers configured</string>
|
||||||
|
<string name="dns_configured_servers">Configured servers</string>
|
||||||
|
<string name="dns_server_info_revertron">The server supports resolving regular ICANN domains, ALFIS domains, OpenNIC domains.\n\nAlso, it blocks ads, analytics and malware websites.\n\nThe server is run by Revertron.</string>
|
||||||
|
<string name="dns_server_info_dialog_title">Server info</string>
|
||||||
|
<string name="ok">OK</string>
|
||||||
|
<string name="cancel">Cancel</string>
|
||||||
|
<string name="remove">Remove</string>
|
||||||
|
<string name="add">Add</string>
|
||||||
|
<string name="dns_add_server_dialog_title">Add DNS server</string>
|
||||||
|
<string name="dns_activity_title">DNS</string>
|
||||||
|
<string name="dns_usable_servers">Usable servers</string>
|
||||||
|
<string name="dns_fix_chrome_based_browsers">Fix Chrome-based browsers</string>
|
||||||
|
<string name="dns_fix_chrome_based_browsers_hint">Chrome-based browsers need an additional fix to understand that you have IPv6 connectivity.</string>
|
||||||
|
<string name="dns_fixes">DNS fixes</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Add table
Add a link
Reference in a new issue