{"record":{"id":"57a198f4c3ef820f","repo":"microg/GmsCore","slug":"pagecontent-is-null","errorCode":null,"errorMessage":"pageContent is null","messagePattern":"pageContent is null","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/model/FamilyViewModel.kt","lineNumber":135,"sourceCode":"                }\n            }\n        }\n    }\n\n    fun loadFamilyManagementPageContent(\n        context: Context,\n        accountName: String,\n        appId: String,\n        memberId: String,\n        leaveFamily: Boolean = false\n    ) {\n        viewModelScope.launch {\n            runCatching {\n                _uiState.update { it.copy(isLoading = true, isError = false) }\n                val oauthToken = requestOauthToken(context, accountName, SERVICE_FAMILY_SCOPE)\n                val currentMember = getCurrentMember(context, accountName, appId, oauthToken)\n                val pageContent = FamilyApiClient.loadFamilyManagementPageContent(context, oauthToken, appId, memberId, currentMember, leaveFamily)\n                pageContent?.body?.parseToPageData() ?: throw RuntimeException(\"pageContent is null\")\n            }.onFailure { throwable ->\n                _uiState.update { it.copy(isLoading = false, isError = true) }\n                _familyChangedStateState.value = FamilyChangedState.Error(throwable.message ?: \"\", 4)\n                Log.d(TAG, \"loadFamilyManagementPageContent error\", throwable)\n            }.onSuccess { pageData ->\n                _uiState.update {\n                    it.copy(\n                        isLoading = false,\n                        title = pageData.sectionMap.getValue(FAMILY_PAGE_CONTENT_TITLE_INDEX),\n                        pageData = pageData\n                    )\n                }\n            }\n        }\n    }\n\n    fun validatePassword(\n        context: Context,","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-core/src/main/kotlin/com/google/android/gms/family/v2/manage/model/FamilyViewModel.kt#L117-L153","documentation":"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.","triggerScenarios":"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.","commonSituations":"Opening the family management page with a stale token, a memberId that no longer exists, or backend responses with empty bodies.","solutions":["Validate the oauth token and memberId before the call; re-authenticate if needed","Make loadFamilyManagementPageContent throw on HTTP errors instead of returning null","Treat a null body as an empty-content state where appropriate instead of an error","The onFailure branch already updates UI state; add retry logic there"],"exampleFix":"// before\npageContent?.body?.parseToPageData() ?: throw RuntimeException(\"pageContent is null\")\n// after\nval body = pageContent?.body\nval pageData = body?.parseToPageData()\nif (pageData == null) {\n    _familyChangedStateState.value = FamilyChangedState.Error(\"No page content\", 4)\n    return@runCatching\n}","handlingStrategy":"validation","validationCode":"val oauthToken = requestOauthToken(context, accountName, SERVICE_FAMILY_SCOPE)\nrequire(memberId.isNotBlank()) { \"memberId required\" }\n// then check the response body before parsing\nval body = pageContent?.body ?: error(\"page content body missing\")","typeGuard":"fun <T> Response<T>?.bodyOrNull(): T? = this?.body","tryCatchPattern":"runCatching {\n    loadAndParsePage()\n}.onFailure { t ->\n    _familyChangedStateState.value = FamilyChangedState.Error(t.message ?: \"\", 4)\n}","preventionTips":["Re-authenticate when tokens may be stale before loading page content","Validate memberId/appId inputs before the API call","Prefer APIs that throw on HTTP errors over ones returning null"],"tags":["android","viewmodel","null-safety","network"],"backgroundTag":"empty-response-body","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}