{"record":{"id":"1b6e93dfb1228f96","repo":"microg/GmsCore","slug":"not-connected","errorCode":null,"errorMessage":"Not connected!","messagePattern":"Not connected!","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"play-services-base/src/main/java/org/microg/gms/common/api/AbstractPlayServicesClient.java","lineNumber":37,"sourceCode":"import android.util.Log;\n\nimport com.google.android.gms.common.GooglePlayServicesClient;\nimport com.google.android.gms.common.api.GoogleApiClient;\n\nimport org.microg.gms.common.ForwardConnectionCallbacks;\nimport org.microg.gms.common.ForwardConnectionFailedListener;\n\npublic class AbstractPlayServicesClient implements GooglePlayServicesClient {\n    private static final String TAG = \"GmsPlayServicesClient\";\n\n    protected final GoogleApiClient googleApiClient;\n\n    public AbstractPlayServicesClient(GoogleApiClient googleApiClient) {\n        this.googleApiClient = googleApiClient;\n    }\n\n    public void assertConnected() {\n        if (!isConnected()) throw new IllegalStateException(\"Not connected!\");\n    }\n\n    @Override\n    public void connect() {\n        Log.d(TAG, \"connect()\");\n        googleApiClient.connect();\n    }\n\n    @Override\n    public void disconnect() {\n        Log.d(TAG, \"disconnect()\");\n        //TODO googleApiClient.disconnect();\n    }\n\n    @Override\n    public boolean isConnected() {\n        return googleApiClient.isConnected();\n    }","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-base/src/main/java/org/microg/gms/common/api/AbstractPlayServicesClient.java#L19-L55","documentation":"AbstractPlayServicesClient.assertConnected() throws IllegalStateException when the underlying GoogleApiClient is not currently connected. Many client API methods call assertConnected() first, so invoking an API operation before the connection is established (or after it dropped) fails with 'Not connected!'.","triggerScenarios":"Calling a client API method (e.g. on a Plus/Drive-style client) before GoogleApiClient.connect() completes its CONNECTION_SUSPENDED->CONNECTED cycle, or after onConnectionSuspended/onConnectionFailed.","commonSituations":"Calling API methods in onCreate/onStart before the async connect() succeeds; not handling onConnectionFailed; calling methods after the client was disconnected in onStop.","solutions":["Wait for onConnected(Bundle) callback before calling any API methods","Check isConnected() before invoking operations","Implement ConnectionCallbacks and ConnectionFailedListener and retry connect() on failure","Use GoogleApiClient with await()/blocking connect in background threads"],"exampleFix":"// before\nclient.doSomething(); // called in onStart, not yet connected\n// after\n@Override public void onConnected(Bundle hint) { client.doSomething(); }\n// or: if (client.isConnected()) client.doSomething();","handlingStrategy":"validation","validationCode":"if (client.isConnected()) {\n    client.doSomething();\n} else {\n    client.connect(); // wait for onConnected\n}","typeGuard":null,"tryCatchPattern":"try { client.doSomething(); } catch (IllegalStateException e) { client.connect(); /* retry after onConnected */ }","preventionTips":["Only call API methods inside onConnected()","Implement onConnectionSuspended/onConnectionFailed handlers","Check isConnected() defensively before each call"],"tags":["connection","state","google-play-services"],"backgroundTag":"invalid-state-transition","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"}