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"> + +