cloudroam
2025-04-15 3466799c94227c5ebba9fb201621e745058867ee
app/src/main/java/com/example/firstapp/App.kt
@@ -3,49 +3,32 @@
import android.annotation.SuppressLint
import android.app.Application
import android.app.PendingIntent
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.location.Geocoder
import android.net.ConnectivityManager
import android.net.wifi.WifiManager
import android.os.Build
import androidx.annotation.NonNull
import androidx.lifecycle.MutableLiveData
import androidx.multidex.MultiDex
import androidx.work.Configuration
import androidx.work.WorkManager
import androidx.work.*
import com.example.firstapp.core.Core
import com.example.firstapp.database.repository.CodeRepository
import com.example.firstapp.database.repository.KeywordRepository
import com.example.firstapp.database.repository.MsgRepository
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.receiver.CactusReceiver
import com.example.firstapp.service.ReminderWorker
import com.example.firstapp.utils.*
import com.example.firstapp.utils.tinker.TinkerLoadLibrary
import com.gyf.cactus.Cactus
import com.gyf.cactus.callback.CactusCallback
import com.gyf.cactus.ext.cactus
import com.hjq.language.MultiLanguages
import com.hjq.language.OnLanguageListener
import com.example.firstapp.core.Core
import com.example.firstapp.database.repository.CodeRepository
import com.example.firstapp.database.repository.MsgRepository
import com.example.firstapp.receiver.CactusReceiver
import com.example.firstapp.service.BluetoothScanService
import com.example.firstapp.service.HttpServerService
import com.example.firstapp.utils.ACTION_START
import com.example.firstapp.utils.AppInfo
import com.example.firstapp.utils.CactusSave
import com.example.firstapp.utils.FRONT_CHANNEL_ID
import com.example.firstapp.utils.FRONT_CHANNEL_NAME
import com.example.firstapp.utils.FRONT_NOTIFY_ID
import com.example.firstapp.utils.FRPC_LIB_VERSION
import com.example.firstapp.utils.HistoryUtils
import com.example.firstapp.utils.Log
import com.example.firstapp.utils.SettingUtils
import com.example.firstapp.utils.SharedPreference
import com.example.firstapp.utils.tinker.TinkerLoadLibrary
import com.king.location.LocationClient
import com.xuexiang.xutil.file.FileUtils
import frpclib.Frpclib
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import java.io.BufferedWriter
@@ -53,18 +36,17 @@
import java.io.FileWriter
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.TimeZone
import java.util.*
import java.util.concurrent.TimeUnit
@Suppress("DEPRECATION")
class App : Application(), CactusCallback, Configuration.Provider by Core {
class App : Application(), CactusCallback, Configuration.Provider {
    val applicationScope = CoroutineScope(SupervisorJob())
    val database by lazy { AppDatabase.getInstance(this) }
    val msgRepository by lazy { MsgRepository(database.msgDao()) }
    val codeRepository by lazy { CodeRepository(database.codeDao()) }
    val keywordRepository by lazy { KeywordRepository(RetrofitClient.apiService,database.keywordDao()) }
    companion object {
        const val TAG: String = "SmsForwarder"
@@ -142,19 +124,27 @@
            } catch (ex: IOException) {
                ex.printStackTrace()
            }
            //使用默认的处理方式让APP停止运行
            defaultHandler?.uncaughtException(thread, throwable)
        }
        try {
            context = applicationContext
            initLibs()
            PreferencesManager.init(this)
            //纯客户端模式
            if (SettingUtils.enablePureClientMode) return
            try {
                if (SettingUtils.enablePureClientMode) return
            } catch (e: Exception) {
                // 捕获SettingUtils未初始化的异常
                Log.e(TAG, "SettingUtils未初始化: ${e.message}")
                // 继续执行后续代码,不返回
            }
            //初始化WorkManager
            WorkManager.initialize(this, Configuration.Builder().build())
            // 初始化WorkManager
            WorkManager.initialize(this, getWorkManagerConfiguration())
            // 设置定时检查提醒的WorkManager
            setupReminderWorker()
            //动态加载FrpcLib
            val libPath = filesDir.absolutePath + "/libs"
@@ -290,6 +280,13 @@
        }
    }
    @NonNull
    override fun getWorkManagerConfiguration(): Configuration {
        return Configuration.Builder()
            .setMinimumLoggingLevel(android.util.Log.DEBUG)
            .build()
    }
    /**
     * 初始化基础库
     */
@@ -297,39 +294,39 @@
        Core.init(this)
        Log.init(applicationContext)
        // 配置文件初始化
       /* SharedPreference.init(applicationContext)
        SharedPreference.init(applicationContext)
        // X系列基础库初始化
//        XBasicLibInit.init(this)
        // 初始化日志打印
        isDebug = SettingUtils.enableDebugMode
        Log.init(applicationContext)
        // 转发历史工具类初始化
        HistoryUtils.init(applicationContext)
//        HistoryUtils.init(applicationContext)
        // 版本更新初始化
//        XUpdateInit.init(this)
        // 运营统计数据
//        UMengInit.init(this)
        // 初始化语种切换框架
        MultiLanguages.init(this)
//        MultiLanguages.init(this)
        // 设置语种变化监听器
        MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
            override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
                // 注意:只有setAppLanguage时触发,clearAppLanguage时不触发
                Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
                switchLanguage(newLocale)
            }
            override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale")
                switchLanguage(newLocale)
                *//*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false
                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem")
                if (isFlowSystem) {
                    CommonUtils.switchLanguage(oldLocale, newLocale)
                }*//*
            }
        })
        switchLanguage(MultiLanguages.getAppLanguage(this))*/
//        MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
//            override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
//                // 注意:只有setAppLanguage时触发,clearAppLanguage时不触发
//                Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
//                switchLanguage(newLocale)
//            }
//
//            override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
//                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale")
//                switchLanguage(newLocale)
//                *//*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false
//                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem")
//                if (isFlowSystem) {
//                    CommonUtils.switchLanguage(oldLocale, newLocale)
//                }*//*
//            }
//        })
//        switchLanguage(MultiLanguages.getAppLanguage(this))
    }
    @SuppressLint("CheckResult")
@@ -452,4 +449,19 @@
//        )
//    }
    /**
     * 设置定时提醒Worker
     * 配置为每天运行一次检查是否有新的提醒内容
     */
    fun setupReminderWorker() {
        Log.d(TAG, "设置定时提醒Worker")
        // 仅在特定时间执行(每天指定时间)
        // 可根据需要设置多个不同时间点的提醒
        ReminderWorker.setupScheduledWorker(this, 9, 0)  // 上午9:00
        ReminderWorker.setupScheduledWorker(this, 13, 50) // 下午13:50
        // 不再使用周期性轮询和立即执行的方式
    }
}