microg/GmsCore · error · RuntimeException

pageContent is null

Error message

pageContent is null

What it means

loadFamilyManagementPageContent throws RuntimeException("pageContent is null") when the family management page content API returns a null response body, so the page data cannot be parsed. It converts an empty API result into an explicit error surfaced to the UI.

Solutions

  1. Validate the oauth token and memberId before the call; re-authenticate if needed
  2. Make loadFamilyManagementPageContent throw on HTTP errors instead of returning null
  3. Treat a null body as an empty-content state where appropriate instead of an error
  4. The onFailure branch already updates UI state; add retry logic there

Example fix

// before
pageContent?.body?.parseToPageData() ?: throw RuntimeException("pageContent is null")
// after
val body = pageContent?.body
val pageData = body?.parseToPageData()
if (pageData == null) {
    _familyChangedStateState.value = FamilyChangedState.Error("No page content", 4)
    return@runCatching
}
Defensive patterns

Strategy: validation

Validate before calling

val oauthToken = requestOauthToken(context, accountName, SERVICE_FAMILY_SCOPE)
require(memberId.isNotBlank()) { "memberId required" }
// then check the response body before parsing
val body = pageContent?.body ?: error("page content body missing")

Type guard

fun <T> Response<T>?.bodyOrNull(): T? = this?.body

Try / catch

runCatching {
    loadAndParsePage()
}.onFailure { t ->
    _familyChangedStateState.value = FamilyChangedState.Error(t.message ?: "", 4)
}

Prevention

When it happens

Trigger: FamilyApiClient.loadFamilyManagementPageContent returns null (request failed silently or server returned no body) — happens with invalid oauth token, unknown memberId, or leaveFamily flows with no page content to render.

Common situations: Opening the family management page with a stale token, a memberId that no longer exists, or backend responses with empty bodies.

Related errors


AI-assisted analysis of microg/GmsCore@157c9d86ac (2026-09-06). Data as JSON: /api/errors/57a198f4c3ef820f. Report an issue: GitHub.

Appendix: source

Thrown at play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/model/FamilyViewModel.kt:135

                }
            }
        }
    }

    fun loadFamilyManagementPageContent(
        context: Context,
        accountName: String,
        appId: String,
        memberId: String,
        leaveFamily: Boolean = false
    ) {
        viewModelScope.launch {
            runCatching {
                _uiState.update { it.copy(isLoading = true, isError = false) }
                val oauthToken = requestOauthToken(context, accountName, SERVICE_FAMILY_SCOPE)
                val currentMember = getCurrentMember(context, accountName, appId, oauthToken)
                val pageContent = FamilyApiClient.loadFamilyManagementPageContent(context, oauthToken, appId, memberId, currentMember, leaveFamily)
                pageContent?.body?.parseToPageData() ?: throw RuntimeException("pageContent is null")
            }.onFailure { throwable ->
                _uiState.update { it.copy(isLoading = false, isError = true) }
                _familyChangedStateState.value = FamilyChangedState.Error(throwable.message ?: "", 4)
                Log.d(TAG, "loadFamilyManagementPageContent error", throwable)
            }.onSuccess { pageData ->
                _uiState.update {
                    it.copy(
                        isLoading = false,
                        title = pageData.sectionMap.getValue(FAMILY_PAGE_CONTENT_TITLE_INDEX),
                        pageData = pageData
                    )
                }
            }
        }
    }

    fun validatePassword(
        context: Context,

View on GitHub (pinned to 157c9d86ac)