0

so I have class constructor:

public class HealthDataStore { // this class is 3rd party api - can't modify
    public HealthDataStore(Context context, HealthDataStore.ConnectionListener listener){ /* bla... */ }

    /* bla... */

    // with Listener Interface:
    public interface ConnectionListener {
        void onConnected();
        void onConnectionFailed(HealthConnectionErrorResult var1);
        void onDisconnected();
    }
}

and in my repository class i have:

public class HealthRepository {
    private string DSConnectionStatus;

    public void connectDataStore(HealthDSConnectionListener listener) {
        mStore = new HealthDataStore(app, listener);
        mStore.connectService();
    }

    // with inner class:
    public class HealthDSConnectionListener implements HealthDataStore.ConnectionListener{
        @Override public void onConnected() { DSConnectionStatus = "Connected"; }

        @Override public void onConnectionFailed(HealthConnectionErrorResult healthConnectionErrorResult) { DSConnectionStatus = "Connection Failed"; }

        @Override public void onDisconnected() { DSConnectionStatus = "Disconnected"; }
    };
}

and in my view model class i have below object:

public class SplashViewModel extends AndroidViewModel {

    public void connectRepoDataStore(){
        // repo is object of class HealthRepository
        repo.connectDataStore(mConnectionListener)
        // other things to do here 
    }

    private final HealthRepository.HealthDSConnectionListener mConnectionListener = new HealthRepository.HealthDSConnectionListener(){
        @Override public void onConnected() {
            super.onConnected(); // i need this super to set DSConnectionStatus value
            // other things to do here 
        }

        @Override public void onConnectionFailed(HealthConnectionErrorResult error) {
            super.onConnectionFailed(error); // i need this super to set DSConnectionStatus value
            // other things to do here 
        }

        @Override public void onDisconnected() {
            super.onDisconnected(); // i need this super to set DSConnectionStatus value
            // other things to do here 
        }
    }

why is private final HealthRepository.HealthDSConnectionListener mConnectionListener = new HealthRepository.HealthDSConnectionListener() throw me error that the class is not enclosing class?

then how should i achieve this? to have my final listener class have capability to set DSConnectionStatus in healthrepository class?

AnD
  • 3,060
  • 8
  • 35
  • 63

1 Answers1

1

Always try to avoid using inner classes if you know you'll have to extend them. Instead use a separate class, and swap the outer class with a field. If you need to modify a private field that you do not want to expose then create a package-private setter.

public class HealthRepository {
    private String DSConnectionStatus;

    public void connectDataStore(HealthDSConnectionListener listener) {
        mStore = new HealthDataStore(app, listener);
        mStore.connectService();
    }

    void setConnectionStatus(String status) {
        DSConnectionStatus = status;
    }
}
// create another class in the same package
public class HealthDSConnectionListener implements HealthDataStore.ConnectionListener {
    private final HealthRepository repo;

    public HealthDSConnectionListener(HealthRepository repo) {
        this.repo = repo;
    }

    @Override public void onConnected() { repo.setConnectionStatus("Connected"); }
    @Override public void onDisconnected() { repo.setConnectionStatus("Disconnected"); }

    @Override public void onConnectionFailed(HealthConnectionErrorResult error) {
        repo.setConnectionStatus("Connection Failed"); 
    }
};
public class SplashViewModel extends AndroidViewModel {
    private final HealthRepository repo;

    public void connectRepoDataStore() {
        // repo is object of class HealthRepository
        repo.connectDataStore(mConnectionListener)
        // other things to do here 
    }

    private final HealthDSConnectionListener mConnectionListener = new HealthDSConnectionListener(repo) {
        @Override public void onConnected() {
            super.onConnected();
            // ...
        }

        @Override public void onConnectionFailed(HealthConnectionErrorResult error) {
            super.onConnectionFailed(error);
            // ...
        }

        @Override public void onDisconnected() {
            super.onDisconnected(); 
            // ...
        }
    }
}
Leo Aso
  • 11,898
  • 3
  • 25
  • 46