世界 4 лет назад
Родитель
Сommit
def0c9c82c

+ 6 - 1
app/src/main/java/io/nekohasekai/sagernet/SagerNet.kt

@@ -40,7 +40,6 @@ import androidx.core.content.getSystemService
 import go.Seq
 import io.nekohasekai.sagernet.bg.SagerConnection
 import io.nekohasekai.sagernet.bg.proto.UidDumper
-import io.nekohasekai.sagernet.utils.CrashHandler
 import io.nekohasekai.sagernet.database.DataStore
 import io.nekohasekai.sagernet.database.SagerDatabase
 import io.nekohasekai.sagernet.ktx.Logs
@@ -48,6 +47,7 @@ import io.nekohasekai.sagernet.ktx.app
 import io.nekohasekai.sagernet.ktx.checkMT
 import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher
 import io.nekohasekai.sagernet.ui.MainActivity
+import io.nekohasekai.sagernet.utils.CrashHandler
 import io.nekohasekai.sagernet.utils.DeviceStorageApp
 import io.nekohasekai.sagernet.utils.PackageCache
 import io.nekohasekai.sagernet.utils.Theme
@@ -129,6 +129,10 @@ class SagerNet : Application(),
 
         lateinit var application: SagerNet
 
+        val isTv by lazy {
+            uiMode.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
+        }
+
         val deviceStorage by lazy {
             if (Build.VERSION.SDK_INT < 24) application else DeviceStorageApp(application)
         }
@@ -147,6 +151,7 @@ class SagerNet : Application(),
         val connectivity by lazy { application.getSystemService<ConnectivityManager>()!! }
         val notification by lazy { application.getSystemService<NotificationManager>()!! }
         val user by lazy { application.getSystemService<UserManager>()!! }
+        val uiMode by lazy { application.getSystemService<UiModeManager>()!! }
         val packageInfo: PackageInfo by lazy { application.getPackageInfo(application.packageName) }
         val directBootSupported by lazy {
             Build.VERSION.SDK_INT >= 24 && try {

+ 16 - 4
app/src/main/java/io/nekohasekai/sagernet/ui/ConfigurationFragment.kt

@@ -29,10 +29,7 @@ import android.provider.OpenableColumns
 import android.text.format.Formatter
 import android.text.method.LinkMovementMethod
 import android.text.util.Linkify
-import android.view.LayoutInflater
-import android.view.MenuItem
-import android.view.View
-import android.view.ViewGroup
+import android.view.*
 import android.widget.ImageView
 import android.widget.LinearLayout
 import android.widget.TextView
@@ -173,6 +170,14 @@ class ConfigurationFragment @JvmOverloads constructor(
         super.onDestroy()
     }
 
+    override fun onKeyDown(ketCode: Int, event: KeyEvent): Boolean {
+        val fragment = (childFragmentManager.findFragmentByTag("f" + selectedGroup.id) as GroupFragment?)
+        fragment?.configurationListView?.apply {
+            if (!hasFocus()) requestFocus()
+        }
+        return super.onKeyDown(ketCode, event)
+    }
+
     val importFile = registerForActivityResult(ActivityResultContracts.GetContent()) { file ->
         if (file != null) runOnDefaultDispatcher {
             try {
@@ -955,6 +960,7 @@ class ConfigurationFragment @JvmOverloads constructor(
                 onViewCreated(requireView(), null)
             }
             checkOrderMenu()
+            configurationListView.requestFocus()
         }
 
         fun checkOrderMenu() {
@@ -1331,6 +1337,12 @@ class ConfigurationFragment @JvmOverloads constructor(
                                     selectedView.visibility = View.VISIBLE
                                     if ((activity as MainActivity).state.canStop) SagerNet.reloadService()
                                 }
+                            } else if (SagerNet.isTv) {
+                                if (SagerNet.started) {
+                                    SagerNet.stopService()
+                                } else {
+                                    SagerNet.startService()
+                                }
                             }
                         }
 

+ 23 - 0
app/src/main/java/io/nekohasekai/sagernet/ui/MainActivity.kt

@@ -26,6 +26,7 @@ import android.net.Uri
 import android.os.Bundle
 import android.os.RemoteException
 import android.provider.Settings
+import android.view.KeyEvent
 import android.view.MenuItem
 import android.widget.Toast
 import androidx.annotation.IdRes
@@ -492,4 +493,26 @@ class MainActivity : ThemedActivity(),
         connection.disconnect(this)
     }
 
+    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
+        when (keyCode) {
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                if (super.onKeyDown(keyCode, event)) return true
+                binding.drawerLayout.open()
+                navigation.requestFocus()
+            }
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                if (binding.drawerLayout.isOpen) {
+                    binding.drawerLayout.close()
+                    return true
+                }
+            }
+        }
+
+        if (super.onKeyDown(keyCode, event)) return true
+        if (binding.drawerLayout.isOpen) return false
+
+        val fragment = supportFragmentManager.findFragmentById(R.id.fragment_holder) as? ToolbarFragment
+        return fragment != null && fragment.onKeyDown(keyCode, event)
+    }
+
 }

+ 2 - 0
app/src/main/java/io/nekohasekai/sagernet/ui/ToolbarFragment.kt

@@ -20,6 +20,7 @@
 package io.nekohasekai.sagernet.ui
 
 import android.os.Bundle
+import android.view.KeyEvent
 import android.view.View
 import androidx.appcompat.widget.Toolbar
 import androidx.core.view.GravityCompat
@@ -42,5 +43,6 @@ open class ToolbarFragment : Fragment {
         }
     }
 
+    open fun onKeyDown(ketCode: Int, event: KeyEvent) = false
     open fun onBackPressed(): Boolean = false
 }