Somehow this doesn't recompose properly: ```fun R...
# compose
r
Somehow this doesn't recompose properly:
Copy code
fun RssNewsCompose(dao: RssFeedDao, url: HttpUrl, exoPlayerBuilder: (Context) -> ExoPlayer) {
    val TAG = "RssNewsActivity"
    var videos: List<RssFeedVideo> by remember { mutableStateOf(listOf()) }
    var position: RssFeedPosition? by remember { mutableStateOf(null) }

    suspend fun reloadData() {
        Log.d(TAG, "Old Videos: $videos")
        videos = dao.getNewestVideosFirst(url)
        Log.d(TAG, "New Videos: $videos")
        Log.d(TAG, "Old Position: $position")
        position = dao.getPosition(url)
        Log.d(TAG, "New Position: $position")
    }

    AutoPlayPlaylist(videos, position, dao = dao, exoPlayerBuilder = exoPlayerBuilder)

    LaunchedEffect(false) {
        reloadData()
        val feedData = getNewestFeed(url).sortedByDescending { it.pubDate }
        if (videos.firstOrNull() != feedData.firstOrNull()) {
            Log.d(TAG, "Got data: $feedData")
            dao.insertAll(*feedData.toTypedArray())
            dao.deletePosition(url)
            reloadData()
        }
    }
}

@Composable
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
fun AutoPlayPlaylist(videos: List<RssFeedVideo>, feedPosition: RssFeedPosition?, dao: RssFeedDao, exoPlayerBuilder: (Context) -> ExoPlayer) {
    val TAG = "AutoPlayPlaylist"
    Log.d(TAG, "Entering AutoPlay")
    val context = LocalContext.current
    val lifecycleOwner = LocalLifecycleOwner.current
    val scope = rememberCoroutineScope()
    var done by remember { mutableStateOf(false) }
    Log.d(TAG, "Entering Continuing AutoPlay")
   [...]
}
Logs:
Copy code
D/RssNewsActivity: Old Position: null
D/RssNewsActivity: New Position: null
Not Playing...
D/RssNewsActivity: Got data: [RssFeedVideo(guid=Guid(value=o49CXJlJ3bz9Vahmwvu1nnxqlWHw1YeChyiypZKtrAM=, isPermaLink=false), feedUrl=<http://localhost:10023/short.rss>, title=Feind im Kopf (2), category=Category(name=Der Bergdoktor, domain=null), videoUrl=<http://localhost:10023/zero-waste.webm>, pubDate=2023-04-22T17:25:00Z)]
D/RssNewsActivity: Old Videos: []
D/RssNewsActivity: New Videos: [RssFeedVideo(guid=Guid(value=o49CXJlJ3bz9Vahmwvu1nnxqlWHw1YeChyiypZKtrAM=, isPermaLink=false), feedUrl=<http://localhost:10023/short.rss>, title=Feind im Kopf (2), category=Category(name=Der Bergdoktor, domain=null), videoUrl=<http://localhost:10023/zero-waste.webm>, pubDate=2023-04-22T17:25:00Z)]
D/RssNewsActivity: Old Position: null
D/RssNewsActivity: New Position: null
But the logs inside
AutoPlayPlaylist
aren't getting hit. robolectric compose context.
🧵 1
Switched to
produceState
, let's see...
Copy code
fun RssNewsCompose(dao: RssFeedDao, url: HttpUrl, exoPlayerBuilder: (Context) -> ExoPlayer) {
    val TAG = "RssNewsActivity"
    Log.d(TAG, "Recomposing")

    val videosAndPosition = produceState(VideosAndPosition(listOf(), null), url) {
        Log.d(TAG, "Fetching state")
        val initialVideos = dao.getNewestVideosFirst(url)
        val initialPosition = dao.getPosition(url)
        value = VideosAndPosition(initialVideos, initialPosition)
        Log.d(TAG, "Set first value: $value")
        val feedData = getNewestFeed(url)
        Log.d(TAG, "new feed data: $feedData")
        dao.insertAll(*feedData.toTypedArray())
        dao.deletePosition(url)
        Log.d(TAG, "Set data")
        val videos = dao.getNewestVideosFirst(url)
        val position = dao.getPosition(url)
        value = VideosAndPosition(videos, position)
        Log.d(TAG, "Set second value: $value")
    }

    AutoPlayPlaylist(videosAndPosition, dao = dao, exoPlayerBuilder = exoPlayerBuilder)
}
Now at
Copy code
fun RssNewsCompose(dao: RssFeedDao, url: HttpUrl, exoPlayerBuilder: (Context) -> ExoPlayer) {
    val TAG = "RssNewsActivity"
    Log.d(TAG, "Recomposing")

    val videosAndPosition by produceState(VideosAndPosition(listOf(), null), url) {
        Log.d(TAG, "Fetching state")
        val initialVideos = dao.getNewestVideosFirst(url)
        val initialPosition = dao.getPosition(url)
        value = VideosAndPosition(initialVideos, initialPosition)
        Log.d(TAG, "Set first value: $value")
        val feedData = getNewestFeed(url)
        Log.d(TAG, "new feed data: $feedData")
        dao.insertAll(*feedData.toTypedArray())
        dao.deletePosition(url)
        Log.d(TAG, "Set data")
        val videos = dao.getNewestVideosFirst(url)
        val position = dao.getPosition(url)
        value = VideosAndPosition(videos, position)
        Log.d(TAG, "Set second value: $value")
    }

    Log.d(TAG, "Current value: $videosAndPosition")

    AutoPlayPlaylist(videosAndPosition, dao = dao, exoPlayerBuilder = exoPlayerBuilder)
}
Shouldn't the Log.d statement appear at least twice?