Compare commits
10 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
4b2bf8f5f4 | |
|
|
7060b99dd9 | |
|
|
58885f69a9 | |
|
|
01dec2de0e | |
|
|
a2c8fd2c1a | |
|
|
414681fa26 | |
|
|
450e04db89 | |
|
|
a982e54eeb | |
|
|
8bddca4996 | |
|
|
397e103596 |
|
|
@ -0,0 +1,16 @@
|
|||
# CodeGraph data files
|
||||
# These are local to each machine and should not be committed
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.db-wal
|
||||
*.db-shm
|
||||
|
||||
# Cache
|
||||
cache/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Hook markers
|
||||
.dirty
|
||||
|
|
@ -23,7 +23,8 @@
|
|||
android:supportsRtl="true"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:theme="@style/Theme.StandAPP">
|
||||
android:theme="@style/Theme.StandAPP"
|
||||
android:hardwareAccelerated="true">
|
||||
|
||||
<activity
|
||||
android:name=".SplashActivity"
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
' setInterval(function() {',
|
||||
' var code = prompt("bridge:_poll", "");',
|
||||
' if (code) { try { eval(code); } catch(e) {} }',
|
||||
' }, 500);',
|
||||
' }, 2000);',
|
||||
'})();'
|
||||
].join('\n');
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ public class CallBackResolution {
|
|||
private static boolean loginState = false;
|
||||
private static String pttLoginStatus = "00"; // 00-未登录 01-登录中 02-已登录
|
||||
private static String pttLoginId = "";
|
||||
private static ScheduledExecutorService keepAliveExecutor = null;
|
||||
|
||||
public static String getPttLoginStatus() {
|
||||
return pttLoginStatus;
|
||||
|
|
@ -543,13 +544,16 @@ public class CallBackResolution {
|
|||
if (tempTxt.contains("已登录")) {
|
||||
String showName = tempTxt.substring(3, tempTxt.length());
|
||||
CallBackUtil.callBackLogin(true, showName);
|
||||
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
|
||||
if (keepAliveExecutor != null && !keepAliveExecutor.isShutdown()) {
|
||||
keepAliveExecutor.shutdownNow();
|
||||
}
|
||||
keepAliveExecutor = Executors.newSingleThreadScheduledExecutor();
|
||||
Runnable task = () -> {
|
||||
Timber.tag(TAG).d( "callBackLogin send tcp and udp");
|
||||
SendAtUtil.sendUDP();
|
||||
SendAtUtil.sendTCP();
|
||||
};
|
||||
executor.scheduleAtFixedRate(task, 0, 40, TimeUnit.SECONDS);
|
||||
keepAliveExecutor.scheduleAtFixedRate(task, 0, 40, TimeUnit.SECONDS);
|
||||
} else if (tempTxt.contains("账号已更新")) {
|
||||
Timber.tag(TAG).w("TTS reports account updated: '%s'", tempTxt);
|
||||
} else if (tempTxt.contains("账号或密码错误")) {
|
||||
|
|
|
|||
|
|
@ -31,10 +31,12 @@ class MainActivity : AppCompatActivity() {
|
|||
@Volatile
|
||||
private var pendingJsCode: String? = null
|
||||
|
||||
private val jsLock = Any()
|
||||
|
||||
@JvmStatic
|
||||
fun executeJs(script: String) {
|
||||
Timber.tag("ExecuteJs").d(script)
|
||||
synchronized(pendingJsCode ?: Any()) {
|
||||
synchronized(jsLock) {
|
||||
// 合并多次调用(用换行分隔)
|
||||
pendingJsCode = if (pendingJsCode != null) "$pendingJsCode;$script" else script
|
||||
}
|
||||
|
|
@ -119,7 +121,7 @@ class MainActivity : AppCompatActivity() {
|
|||
// 获取并清除待执行的 JS 代码(由 bridge.js 轮询)
|
||||
@JvmStatic
|
||||
fun pollPendingJs(): String {
|
||||
synchronized(pendingJsCode ?: Any()) {
|
||||
synchronized(jsLock) {
|
||||
val code = pendingJsCode ?: ""
|
||||
pendingJsCode = null
|
||||
return code
|
||||
|
|
@ -472,6 +474,16 @@ class MainActivity : AppCompatActivity() {
|
|||
return super.onKeyDown(keyCode, event)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
geckoSession?.setActive(false)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
geckoSession?.setActive(true)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
cancelTimeoutTimer()
|
||||
geckoView.releaseSession()
|
||||
|
|
|
|||
|
|
@ -7,14 +7,37 @@ import android.os.Looper
|
|||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
class SplashActivity : AppCompatActivity() {
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
private var checkCount = 0
|
||||
private val maxChecks = 20 // 最多检查20次(2秒)
|
||||
|
||||
private val checkInitRunnable = object : Runnable {
|
||||
override fun run() {
|
||||
if (MyApplication.pNative != null || checkCount >= maxChecks) {
|
||||
navigateToLogin()
|
||||
} else {
|
||||
checkCount++
|
||||
handler.postDelayed(this, 100)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_splash)
|
||||
|
||||
// 延迟 2 秒进入登录界面
|
||||
Handler(Looper.getMainLooper()).postDelayed({
|
||||
// 异步检查PTT JNI初始化状态,避免硬等待2秒
|
||||
handler.post(checkInitRunnable)
|
||||
}
|
||||
|
||||
private fun navigateToLogin() {
|
||||
if (isFinishing || isDestroyed) return
|
||||
startActivity(Intent(this, LoginActivity::class.java))
|
||||
finish()
|
||||
}, 2000)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
handler.removeCallbacks(checkInitRunnable)
|
||||
super.onDestroy()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@ object GpioManager {
|
|||
Timber.tag("GPIO").i("Start GPIO listening thread")
|
||||
while (mIsRunning) {
|
||||
try {
|
||||
// 硬件轮询频率优化:50ms 既能保证响应速度,又能降低 CPU 消耗
|
||||
Thread.sleep(50)
|
||||
// 硬件轮询频率优化:150ms 既能保证响应速度,又能降低 CPU 消耗
|
||||
Thread.sleep(150)
|
||||
val manager = mZysjSystemManager ?: continue
|
||||
|
||||
// 获取 GPIO 1 的值 (0 按下, 1 松开)
|
||||
|
|
|
|||
|
|
@ -98,19 +98,6 @@ object LogManager {
|
|||
onCrashDetected(null, thread.name, throwable)
|
||||
defaultHandler?.uncaughtException(thread, throwable) ?: exitProcess(1)
|
||||
}
|
||||
|
||||
// 2. 捕获主线程 Looper
|
||||
android.os.Handler(android.os.Looper.getMainLooper()).post {
|
||||
while (true) {
|
||||
try {
|
||||
android.os.Looper.loop()
|
||||
} catch (e: Throwable) {
|
||||
onCrashDetected(null, "MainLooper", e)
|
||||
// 如果是 UnsatisfiedLinkError,这种错误无法恢复,必须抛出让系统处理
|
||||
throw e
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun cleanOldLogs(dir: File) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue