mirror of
				https://github.com/yggdrasil-network/yggdrasil-android.git
				synced 2025-11-04 11:15:08 +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