package com.kuxhausen.huemore; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.support.v7.app.ActionBarActivity; import com.kuxhausen.huemore.net.ConnectivityService; import com.kuxhausen.huemore.net.ConnectivityService.LocalBinder; import com.kuxhausen.huemore.net.DeviceManager.OnStateChangedListener; import com.kuxhausen.huemore.net.OnConnectionStatusChangedListener; import com.kuxhausen.huemore.state.Group; import java.util.ArrayList; public abstract class NetworkManagedActivity extends ActionBarActivity implements OnConnectionStatusChangedListener, OnStateChangedListener, OnServiceConnectedListener { public void setGroup(Group g) { if (mBound) { mService.getDeviceManager().onGroupSelected(g, null); } } private ConnectivityService mService = new ConnectivityService(); private boolean mBound = false; private ArrayList<OnServiceConnectedListener> serviceListeners = new ArrayList<OnServiceConnectedListener>(); // register for a one time on service connected message public void registerOnServiceConnectedListener(OnServiceConnectedListener l) { if (mBound) { l.onServiceConnected(); } else { serviceListeners.add(l); } } public ConnectivityService getService() { if (mBound) { return mService; } else { return null; } } public boolean boundToService() { return mBound; } @Override public void onServiceConnected() { // override in subclass if needed } @Override public void onConnectionStatusChanged() { // override in subclass if needed } @Override public void onStateChanged() { // override in subclass if needed } @Override public void onResume() { super.onResume(); // Bind to LocalService Intent intent = new Intent(this, ConnectivityService.class); startService(intent); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); this.registerOnServiceConnectedListener(this); } @Override public void onPause() { super.onPause(); // Unbind from the service if (mBound) { mService.getDeviceManager().removeOnConnectionStatusChangedListener(this); mService.getDeviceManager().removeStateListener(NetworkManagedActivity.this); mService.getDeviceManager().removeBrightnessListener(this); unbindService(mConnection); mBound = false; } } /** * Defines callbacks for service binding, passed to bindService() */ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // We've bound to LocalService, cast the IBinder and get LocalService instance LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; mService.getDeviceManager().addOnConnectionStatusChangedListener(NetworkManagedActivity.this); mService.getDeviceManager().registerStateListener(NetworkManagedActivity.this); mService.getDeviceManager().registerBrightnessListener(NetworkManagedActivity.this); for (OnServiceConnectedListener l : serviceListeners) { l.onServiceConnected(); } serviceListeners.clear(); } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; }