class BroadcastDetector extends OpcodeStackDetector {

    private static final String ANDROID_BROADCAST_TYPE = "ANDROID_BROADCAST";
    private BugReporter bugReporter;

    public BroadcastDetector(BugReporter bugReporter) {
        this.bugReporter = bugReporter;
    }

    @Override
    public void sawOpcode(int seen) {<FILL_FUNCTION_BODY>}
}

        //printOpCode(seen);

        if (seen == Const.INVOKEVIRTUAL &&
                (
                    getNameConstantOperand().equals("sendBroadcast") ||
                    getNameConstantOperand().equals("sendBroadcastAsUser") ||
                    getNameConstantOperand().equals("sendOrderedBroadcast") ||
                    getNameConstantOperand().equals("sendOrderedBroadcastAsUser")
                )) {

            // The LocalBroadcastManager object is safe. The broadcast doesn't leave the application scope.
            // We check if the class extends android.support.v4.content.LocalBroadcastManager
            // We will also check if the class is named "LocalBroadcastManager" in case the version in the namespace changes.
            if (!InterfaceUtils.isSubtype(getClassConstantOperand(), "android.support.v4.content.LocalBroadcastManager")
                    && !getClassConstantOperand().endsWith("LocalBroadcastManager")) {
                bugReporter.reportBug(new BugInstance(this, ANDROID_BROADCAST_TYPE, Priorities.NORMAL_PRIORITY) //
                        .addClass(this).addMethod(this).addSourceLine(this));
            }
        }
    
<no_super_class>