{"record":{"id":"f11b100ec35895d9","repo":"Tencent/matrix","slug":"use-onstatechanged-batterystate-string-instead","errorCode":null,"errorMessage":"Use #onStateChanged(BatteryState, String) instead","messagePattern":"Use #onStateChanged\\(BatteryState, String\\) instead","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"matrix/matrix-android/matrix-battery-canary/src/main/java/com/tencent/matrix/batterycanary/BatteryEventDelegate.java","lineNumber":669,"sourceCode":"             * @param isLowBattery {@link Intent#ACTION_BATTERY_LOW}, {@link Intent#ACTION_BATTERY_OKAY}\n             * @return return true if your listening is done, thus we remove your listener\n             */\n            @UiThread\n            boolean onBatteryStateChanged(BatteryState batteryState, boolean isLowBattery);\n        }\n\n        @SuppressWarnings(\"unused\")\n        class DefaultListenerImpl implements ExListener {\n\n            final boolean mKeepAlive;\n\n            public DefaultListenerImpl(boolean keepAlive) {\n                mKeepAlive = keepAlive;\n            }\n\n            @Override\n            public boolean onStateChanged(String event) {\n                throw new RuntimeException(\"Use #onStateChanged(BatteryState, String) instead\");\n            }\n\n            @Override\n            public boolean onAppLowEnergy(BatteryState batteryState, long backgroundMillis) {\n                return !mKeepAlive;\n            }\n\n            @Override\n            public boolean onStateChanged(BatteryState batteryState, String event) {\n                return !mKeepAlive;\n            }\n\n            @Override\n            public boolean onBatteryTemperatureChanged(BatteryState batteryState, int temperature) {\n                return !mKeepAlive;\n            }\n\n            @Override","sourceCodeStart":651,"sourceCodeEnd":687,"githubUrl":"https://github.com/Tencent/matrix/blob/3b8293bd65d47eeea7caf1f32a3a5d4d5eab60e7/matrix/matrix-android/matrix-battery-canary/src/main/java/com/tencent/matrix/batterycanary/BatteryEventDelegate.java#L651-L687","documentation":"DefaultListenerImpl deliberately overrides onStateChanged(String) to throw RuntimeException unconditionally, steering callers to the newer onStateChanged(BatteryState, String) callback. The raw-string variant is deprecated because it loses typed battery-state information.","triggerScenarios":"Registering a listener object whose class extends DefaultListenerImpl (or uses it as a base) and relies on the inherited string-based onStateChanged(String) without overriding it — the delegate will call the base implementation and throw.","commonSituations":"Upgrading the battery-canary library where the callback signature changed from String to (BatteryState, String); copying an old listener implementation that fails to override the new method.","solutions":["Override onStateChanged(BatteryState batteryState, String event) in your listener subclass and put handling logic there.","Remove any explicit calls to onStateChanged(String) in listener code.","Migrate custom listeners to implement the current BatteryEventDelegate listener interface directly instead of extending DefaultListenerImpl."],"exampleFix":"// before\nnew BatteryEventDelegate.DefaultListenerImpl(true) {\n    // no override: base throws on callback\n}\n\n// after\nnew BatteryEventDelegate.DefaultListenerImpl(true) {\n    @Override\n    public boolean onStateChanged(BatteryState state, String event) {\n        return handle(state, event);\n    }\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always override onStateChanged(BatteryState, String) in DefaultListenerImpl subclasses.","When upgrading the library, re-check listener method signatures for breaking changes.","Favor implementing the listener interface directly over extending the default base class."],"tags":["android","deprecated-api","listener","battery"],"backgroundTag":"deprecated-api-usage","analyzedSha":"3b8293bd65d47eeea7caf1f32a3a5d4d5eab60e7","analyzedAt":"2026-09-08T08:01:39.722Z","contentChangedAt":"2026-09-08T08:01:39.722Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}