Misc. cleanup and formatting

This commit is contained in:
Maksim Karasev 2024-06-14 16:57:47 +03:00
parent fdd711eef4
commit 1a9573bb41
24 changed files with 58 additions and 65 deletions

View file

@ -28,7 +28,7 @@ class AddServerDialogFragment : DialogFragment() {
* implement this interface in order to receive event callbacks. * implement this interface in order to receive event callbacks.
* Each method passes the DialogFragment in case the host needs to query it. */ * Each method passes the DialogFragment in case the host needs to query it. */
interface NoticeDialogListener { interface NoticeDialogListener {
fun onDialogPositiveClick(dialog: DialogFragment, server: String) fun onDialogPositiveClick(server: String)
} }
// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
@ -62,14 +62,15 @@ class AddServerDialogFragment : DialogFragment() {
builder.setTitle(R.string.add_server) builder.setTitle(R.string.add_server)
.setView(view) .setView(view)
// Add action buttons // Add action buttons
.setPositiveButton(R.string.menu_add .setPositiveButton(
R.string.menu_add
) { _, _ -> ) { _, _ ->
listener.onDialogPositiveClick( listener.onDialogPositiveClick(
this,
binding.editTextServerAddr.text.toString().trim() binding.editTextServerAddr.text.toString().trim()
) )
} }
.setNegativeButton(R.string.cancel .setNegativeButton(
R.string.cancel
) { _, _ -> ) { _, _ ->
dialog?.cancel() dialog?.cancel()
} }
@ -79,7 +80,6 @@ class AddServerDialogFragment : DialogFragment() {
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
val button = ((dialog) as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE) val button = ((dialog) as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)
binding.editTextServerAddr.addTextChangedListener(object : TextWatcher { binding.editTextServerAddr.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

View file

@ -7,7 +7,7 @@ import androidx.fragment.app.DialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
class DeleteServerDialogFragment(private val position: Int): DialogFragment() { class DeleteServerDialogFragment(private val position: Int) : DialogFragment() {
// Use this instance of the interface to deliver action events // Use this instance of the interface to deliver action events
private lateinit var listener: NoticeDialogListener private lateinit var listener: NoticeDialogListener
@ -15,7 +15,7 @@ class DeleteServerDialogFragment(private val position: Int): DialogFragment() {
* implement this interface in order to receive event callbacks. * implement this interface in order to receive event callbacks.
* Each method passes the DialogFragment in case the host needs to query it. */ * Each method passes the DialogFragment in case the host needs to query it. */
interface NoticeDialogListener { interface NoticeDialogListener {
fun onDialogPositiveClick(dialog: DialogFragment, position: Int) fun onDialogPositiveClick(position: Int)
} }
// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
@ -27,21 +27,26 @@ class DeleteServerDialogFragment(private val position: Int): DialogFragment() {
listener = context as NoticeDialogListener listener = context as NoticeDialogListener
} catch (e: ClassCastException) { } catch (e: ClassCastException) {
// The activity doesn't implement the interface, throw exception // The activity doesn't implement the interface, throw exception
throw ClassCastException((context.toString() + throw ClassCastException(
" must implement NoticeDialogListener")) (context.toString() +
" must implement NoticeDialogListener")
)
} }
} }
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return activity?.let { return activity?.let {
val builder = MaterialAlertDialogBuilder(it) val builder = MaterialAlertDialogBuilder(it)
builder.setTitle(R.string.delete_question) builder.setTitle(R.string.delete_question)
.setMessage(R.string.delete_message) .setMessage(R.string.delete_message)
.setPositiveButton(R.string.delete .setPositiveButton(
R.string.delete
) { _, _ -> ) { _, _ ->
listener.onDialogPositiveClick(this, position) listener.onDialogPositiveClick(position)
} }
.setNegativeButton(R.string.cancel .setNegativeButton(
R.string.cancel
) { _, _ -> ) { _, _ ->
dialog?.cancel() dialog?.cancel()
} }

View file

@ -210,7 +210,7 @@ class DnsTileService : TileService() {
val index = items.indexOf(currentAddress) val index = items.indexOf(currentAddress)
if (index == -1 || currentAddress == null) { if (index == -1 || currentAddress == null) {
return items[0] return items[0]
} }
if (index == items.size - 1) { if (index == items.size - 1) {
return null return null

View file

@ -14,7 +14,6 @@ import android.util.Log
import android.view.Menu import android.view.Menu
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.DialogFragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import org.lsposed.hiddenapibypass.HiddenApiBypass import org.lsposed.hiddenapibypass.HiddenApiBypass
import rikka.shizuku.Shizuku import rikka.shizuku.Shizuku
@ -67,7 +66,10 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
binding.topAppBar.setOnMenuItemClickListener { item -> binding.topAppBar.setOnMenuItemClickListener { item ->
when (item.itemId) { when (item.itemId) {
R.id.privacy_policy -> { R.id.privacy_policy -> {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/privacy_policy")) val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/privacy_policy")
)
startActivity(browserIntent) startActivity(browserIntent)
true true
} }
@ -128,7 +130,7 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
Shizuku.removeRequestPermissionResultListener(this::onRequestPermissionResult) Shizuku.removeRequestPermissionResultListener(this::onRequestPermissionResult)
} }
override fun onDialogPositiveClick(dialog: DialogFragment, server: String) { override fun onDialogPositiveClick(server: String) {
if (server.isEmpty()) { if (server.isEmpty()) {
Toast.makeText(this, R.string.server_length_error, Toast.LENGTH_SHORT).show() Toast.makeText(this, R.string.server_length_error, Toast.LENGTH_SHORT).show()
return return
@ -139,7 +141,7 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
sharedPrefs.dns_servers = items sharedPrefs.dns_servers = items
} }
override fun onDialogPositiveClick(dialog: DialogFragment,position: Int) { override fun onDialogPositiveClick(position: Int) {
items.removeAt(position) items.removeAt(position)
adapter.setData(items.toMutableList()) adapter.setData(items.toMutableList())
adapter.notifyItemRemoved(position) adapter.notifyItemRemoved(position)
@ -194,7 +196,9 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
finish() finish()
} }
} }
} }
@SuppressLint("PrivateApi") @SuppressLint("PrivateApi")
override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) { override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) {
val isGranted = grantResult == PackageManager.PERMISSION_GRANTED val isGranted = grantResult == PackageManager.PERMISSION_GRANTED
@ -202,7 +206,10 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
if (isGranted) { if (isGranted) {
grantPermissionWithShizuku() grantPermissionWithShizuku()
} else if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { } else if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/")) val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/")
)
startActivity(browserIntent) startActivity(browserIntent)
finish() finish()
} }

View file

@ -1,19 +1,19 @@
package ru.karasevm.privatednstoggle package ru.karasevm.privatednstoggle
import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import java.util.*
class RecyclerAdapter(val items: MutableList<String>): RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() { class RecyclerAdapter(private val items: MutableList<String>) :
RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
var onItemClick: ((Int) -> Unit)? = null var onItemClick: ((Int) -> Unit)? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerAdapter.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerAdapter.ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_row, parent, false) val view =
LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_row, parent, false)
val vh = ViewHolder(view) val vh = ViewHolder(view)
return vh return vh
} }
@ -30,15 +30,16 @@ class RecyclerAdapter(val items: MutableList<String>): RecyclerView.Adapter<Recy
} }
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView) val textView: TextView = itemView.findViewById(R.id.textView)
init { init {
itemView.setOnClickListener { itemView.setOnClickListener {
onItemClick?.invoke(adapterPosition) onItemClick?.invoke(adapterPosition)
} }
} }
} }
fun setData(newItems: MutableList<String>) { fun setData(newItems: MutableList<String>) {
items.run { items.run {
clear() clear()

View file

@ -9,6 +9,7 @@ import android.widget.Toast
import androidx.core.content.ContextCompat.checkSelfPermission import androidx.core.content.ContextCompat.checkSelfPermission
import ru.karasevm.privatednstoggle.R import ru.karasevm.privatednstoggle.R
@Suppress("unused")
object PrivateDNSUtils { object PrivateDNSUtils {
const val DNS_MODE_OFF = "off" const val DNS_MODE_OFF = "off"
const val DNS_MODE_AUTO = "opportunistic" const val DNS_MODE_AUTO = "opportunistic"

View file

@ -1,15 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#FFFFFF">
<group android:scaleX="0.92"
android:scaleY="0.92"
android:translateX="0.96"
android:translateY="0.96">
<path
android:fillColor="@android:color/white"
android:pathData="M11.8,10.9c-2.27,-0.59 -3,-1.2 -3,-2.15 0,-1.09 1.01,-1.85 2.7,-1.85 1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-1.94,0.42 -3.5,1.68 -3.5,3.61 0,2.31 1.91,3.46 4.7,4.13 2.5,0.6 3,1.48 3,2.41 0,0.69 -0.49,1.79 -2.7,1.79 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c1.95,-0.37 3.5,-1.5 3.5,-3.55 0,-2.84 -2.43,-3.81 -4.7,-4.4z"/>
</group>
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 685 B

View file

@ -10,17 +10,17 @@
android:id="@+id/topAppBarLayout" android:id="@+id/topAppBarLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="parent" app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintRight_toLeftOf="parent"> app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/topAppBar" android:id="@+id/topAppBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize" android:minHeight="?attr/actionBarSize"
app:title="@string/app_name" app:menu="@menu/menu_main"
app:menu="@menu/menu_main" /> app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>

View file

@ -8,21 +8,20 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:layout_margin="16dp"
android:hint="@string/add_edittext_hint"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent">
android:hint="@string/add_edittext_hint">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/editTextServerAddr" android:id="@+id/editTextServerAddr"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textNoSuggestions"
android:maxLines="1"
android:ems="10" android:ems="10"
android:importantForAutofill="no" android:importantForAutofill="no"
/> android:inputType="textNoSuggestions"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -4,8 +4,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingStart="17dp" android:paddingStart="17dp"
android:paddingEnd="17dp" android:paddingTop="10dp"
android:paddingTop="10dp"> android:paddingEnd="17dp">
<TextView <TextView
android:id="@+id/autoOptionHeader" android:id="@+id/autoOptionHeader"

View file

@ -1,22 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:background="?android:attr/selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true"> android:focusable="true"
android:foreground="?android:attr/selectableItemBackground">
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -7,10 +7,10 @@
<LinearLayout <LinearLayout
android:id="@+id/bottom_sheet" android:id="@+id/bottom_sheet"
style="@style/Widget.Material3.BottomSheet" style="@style/Widget.Material3.BottomSheet"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="vertical"> android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> <monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon> </adaptive-icon>

View file

@ -1,8 +1,8 @@
<resources> <resources xmlns:tools="http://schemas.android.com/tools">
<color name="ic_launcher_background">#498EE8</color> <color name="ic_launcher_background">#498EE8</color>
<color name="seed">#6750A4</color> <color name="seed" tools:keep="@color/seed">#6750A4</color>
<color name="md_theme_light_primary">#6750A4</color> <color name="md_theme_light_primary">#6750A4</color>
<color name="md_theme_light_secondary">#625B71</color> <color name="md_theme_light_secondary">#625B71</color>
<color name="md_theme_light_tertiary">#7D5260</color> <color name="md_theme_light_tertiary">#7D5260</color>

View file

@ -8,9 +8,7 @@
<string name="add_server">Add Server</string> <string name="add_server">Add Server</string>
<string name="menu_add">Add</string> <string name="menu_add">Add</string>
<string name="menu_privacy_policy">Privacy Policy</string> <string name="menu_privacy_policy">Privacy Policy</string>
<string name="menu_auto_enabled">Enable auto</string>
<string name="select_server">Select Server</string> <string name="select_server">Select Server</string>
<string name="auto_mode_clarification">Automatic (opportunistic) DNS mode will now be available in the tile</string>
<string name="done">Done</string> <string name="done">Done</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
<string name="delete_question">Delete</string> <string name="delete_question">Delete</string>