|
@@ -28,10 +28,14 @@ import androidx.tv.material3.ExperimentalTvMaterial3Api
|
|
|
import androidx.tv.material3.MaterialTheme
|
|
import androidx.tv.material3.MaterialTheme
|
|
|
import androidx.tv.material3.NonInteractiveSurfaceDefaults
|
|
import androidx.tv.material3.NonInteractiveSurfaceDefaults
|
|
|
import androidx.tv.material3.Surface
|
|
import androidx.tv.material3.Surface
|
|
|
|
|
+import org.mjdev.tvlib.BuildConfig
|
|
|
import org.mjdev.tvlib.annotations.TvPreview
|
|
import org.mjdev.tvlib.annotations.TvPreview
|
|
|
import org.mjdev.tvlib.extensions.ContextExt.isATv
|
|
import org.mjdev.tvlib.extensions.ContextExt.isATv
|
|
|
import org.mjdev.tvlib.extensions.NavExt.rememberNavControllerEx
|
|
import org.mjdev.tvlib.extensions.NavExt.rememberNavControllerEx
|
|
|
import org.mjdev.tvlib.extensions.NavGraphBuilderExt.screen
|
|
import org.mjdev.tvlib.extensions.NavGraphBuilderExt.screen
|
|
|
|
|
+import org.mjdev.tvlib.helpers.anr.agent.ANRSpyAgent
|
|
|
|
|
+import org.mjdev.tvlib.helpers.anr.agent.ANRSpyListener
|
|
|
|
|
+import org.mjdev.tvlib.helpers.anr.models.MethodModel
|
|
|
import org.mjdev.tvlib.navigation.NavGraphBuilderEx
|
|
import org.mjdev.tvlib.navigation.NavGraphBuilderEx
|
|
|
import org.mjdev.tvlib.ui.components.navigation.NavHostEx
|
|
import org.mjdev.tvlib.ui.components.navigation.NavHostEx
|
|
|
import org.mjdev.tvlib.ui.components.screen.EmptyScreen
|
|
import org.mjdev.tvlib.ui.components.screen.EmptyScreen
|
|
@@ -47,10 +51,43 @@ open class ComposableActivity : ComponentActivity() {
|
|
|
screen(route = EmptyScreen())
|
|
screen(route = EmptyScreen())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private var anrCallback = object : ANRSpyListener {
|
|
|
|
|
+ override fun onWait(ms: Long) {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Deprecated("This callback will be removed in future")
|
|
|
|
|
+ override fun onAnrStackTrace(stackstrace: Array<StackTraceElement>) {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onReportAvailable(methodList: List<MethodModel>) {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onAnrDetected(
|
|
|
|
|
+ details: String,
|
|
|
|
|
+ stackTrace: Array<StackTraceElement>,
|
|
|
|
|
+ packageMethods: List<String>?
|
|
|
|
|
+ ) {
|
|
|
|
|
+ Timber.e(details)
|
|
|
|
|
+ Timber.e(stackTrace.toString())
|
|
|
|
|
+ Timber.e(packageMethods.toString())
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private val anrSpyAgent = ANRSpyAgent.Builder(this)
|
|
|
|
|
+ .setTimeOut(500)
|
|
|
|
|
+ .setSpyListener(anrCallback)
|
|
|
|
|
+ .setThrowException(false)
|
|
|
|
|
+ .enableReportAnnotatedMethods(true)
|
|
|
|
|
+ .build()
|
|
|
|
|
+
|
|
|
open val backgroundColor = Color(0xff202020)
|
|
open val backgroundColor = Color(0xff202020)
|
|
|
open val roundCornerSize: Dp = 0.dp
|
|
open val roundCornerSize: Dp = 0.dp
|
|
|
open val backgroundShape: Shape = RoundedCornerShape(roundCornerSize)
|
|
open val backgroundShape: Shape = RoundedCornerShape(roundCornerSize)
|
|
|
|
|
|
|
|
|
|
+ fun reportANR() {
|
|
|
|
|
+ anrSpyAgent.start()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@TvPreview
|
|
@TvPreview
|
|
|
@OptIn(ExperimentalTvMaterial3Api::class)
|
|
@OptIn(ExperimentalTvMaterial3Api::class)
|
|
|
@Composable
|
|
@Composable
|
|
@@ -81,6 +118,9 @@ open class ComposableActivity : ComponentActivity() {
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
super.onCreate(savedInstanceState)
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
+ if (BuildConfig.DEBUG) {
|
|
|
|
|
+ reportANR()
|
|
|
|
|
+ }
|
|
|
WindowCompat.setDecorFitsSystemWindows(window, !isATv)
|
|
WindowCompat.setDecorFitsSystemWindows(window, !isATv)
|
|
|
setContent {
|
|
setContent {
|
|
|
Compose()
|
|
Compose()
|