diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a723722..19cba10 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
+
()!! }
val connectivity by lazy { application.getSystemService()!! }
val packageManager by lazy { application.packageManager }
+ val powerManager by lazy { application.getSystemService()!! }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt b/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt
index 21a8280..0c25b03 100644
--- a/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt
+++ b/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt
@@ -268,7 +268,8 @@ class DashboardFragment : Fragment(), CommandClientHandler {
return
}
runCatching {
- Libbox.newStandaloneCommandClient(mainActivity.filesDir.absolutePath).serviceReload()
+ Libbox.newStandaloneCommandClient(mainActivity.filesDir.absolutePath)
+ .serviceReload()
}.onFailure {
withContext(Dispatchers.Main) {
mainActivity.errorDialogBuilder(it).show()
diff --git a/app/src/main/java/io/nekohasekai/sfa/ui/main/SettingsFragment.kt b/app/src/main/java/io/nekohasekai/sfa/ui/main/SettingsFragment.kt
index 13afb4c..d1b46a0 100644
--- a/app/src/main/java/io/nekohasekai/sfa/ui/main/SettingsFragment.kt
+++ b/app/src/main/java/io/nekohasekai/sfa/ui/main/SettingsFragment.kt
@@ -1,14 +1,19 @@
package io.nekohasekai.sfa.ui.main
+import android.content.Intent
+import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.core.view.isGone
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.microsoft.appcenter.AppCenter
import com.microsoft.appcenter.distribute.Distribute
import io.nekohasekai.libbox.Libbox
+import io.nekohasekai.sfa.Application
import io.nekohasekai.sfa.R
import io.nekohasekai.sfa.constant.EnabledType
import io.nekohasekai.sfa.database.Settings
@@ -35,6 +40,14 @@ class SettingsFragment : Fragment() {
return binding.root
}
+ private val requestIgnoreBatteryOptimizations = registerForActivityResult(
+ ActivityResultContracts.StartActivityForResult()
+ ) { _ ->
+ lifecycleScope.launch(Dispatchers.IO) {
+ reloadSettings()
+ }
+ }
+
private fun onCreate() {
val activity = activity as MainActivity? ?: return
binding.versionText.text = Libbox.version()
@@ -80,6 +93,17 @@ class SettingsFragment : Fragment() {
Settings.disableMemoryLimit = !newValue
}
}
+ binding.dontKillMyAppButton.setOnClickListener {
+ it.context.launchCustomTab("https://dontkillmyapp.com/")
+ }
+ binding.requestIgnoreBatteryOptimizationsButton.setOnClickListener {
+ requestIgnoreBatteryOptimizations.launch(
+ Intent(
+ android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
+ Uri.parse("package:${Application.application.packageName}")
+ )
+ )
+ }
binding.communityButton.setOnClickListener {
it.context.launchCustomTab("https://community.sagernet.org/")
}
@@ -96,6 +120,8 @@ class SettingsFragment : Fragment() {
)
val appCenterEnabled = Settings.analyticsAllowed == Settings.ANALYSIS_ALLOWED
val checkUpdateEnabled = Settings.checkUpdateEnabled
+ val removeBackgroudPermissionPage =
+ Application.powerManager.isIgnoringBatteryOptimizations(Application.application.packageName)
withContext(Dispatchers.Main) {
binding.dataSizeText.text = dataSize
binding.appCenterEnabled.text = EnabledType.from(appCenterEnabled).name
@@ -105,6 +131,7 @@ class SettingsFragment : Fragment() {
binding.checkUpdateEnabled.setSimpleItems(R.array.enabled)
binding.disableMemoryLimit.text = EnabledType.from(!Settings.disableMemoryLimit).name
binding.disableMemoryLimit.setSimpleItems(R.array.enabled)
+ binding.backgroundPermissionCard.isGone = removeBackgroudPermissionPage
}
}
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index 7c0083d..92227eb 100644
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -1,229 +1,294 @@
-
+ android:orientation="vertical">
-
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:padding="16dp">
-
+ android:layout_height="wrap_content">
-
-
-
-
+ android:orientation="vertical"
+ android:padding="16dp">
-
+
+
+
+ android:layout_marginTop="16dp"
+ android:hint="@string/enabled">
-
+
-
+
-
+ android:layout_marginTop="8dp"
+ android:hint="@string/check_update">
-
+
-
-
+
-
+
+
-
+ android:layout_marginTop="16dp">
-
-
-
-
-
+ android:orientation="vertical"
+ android:paddingStart="16dp"
+ android:paddingTop="16dp"
+ android:paddingEnd="16dp"
+ android:paddingBottom="8dp">
-
+
+
+
+
+ android:layout_marginTop="8dp"
+ android:hint="@string/memory_limit">
-
+
-
+
-
+ android:layout_marginTop="16dp">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_marginTop="8dp"
+ android:gravity="center_vertical|end"
+ android:orientation="horizontal">
+
+
+
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_marginTop="16dp"
+ android:visibility="gone"
+ tools:visibility="visible">
-
-
-
-
-
+ android:orientation="vertical"
+ android:paddingStart="16dp"
+ android:paddingTop="16dp"
+ android:paddingEnd="16dp"
+ android:paddingBottom="8dp">
-
+ android:text="@string/background_permission"
+ android:textAppearance="?attr/textAppearanceTitleLarge">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 850214d..808fc20 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -80,5 +80,9 @@
Documentation
Community
Memory Limit
+ Background permission
+ Apply for the necessary permissions in order for the VPN to function properly.\n\nIf you are using a device made by a Chinese company, the card may not disappear after the permission is granted.
+ Read More
+ Ignore battery optimizations
\ No newline at end of file