package jp.kshoji.blemidi.service; import android.annotation.TargetApi; import android.app.Service; import android.content.Intent; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; import java.util.Collections; import java.util.HashSet; import java.util.Set; import jp.kshoji.blemidi.device.MidiInputDevice; import jp.kshoji.blemidi.device.MidiOutputDevice; import jp.kshoji.blemidi.listener.OnMidiDeviceAttachedListener; import jp.kshoji.blemidi.listener.OnMidiDeviceDetachedListener; import jp.kshoji.blemidi.util.Constants; /** * Abstract Service for BLE MIDI * * @author K.Shoji */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) abstract class AbstractBleMidiService extends Service { private final Set<MidiInputDevice> midiInputDevices = new HashSet<>(); private final Set<MidiOutputDevice> midiOutputDevices = new HashSet<>(); private OnMidiDeviceAttachedListener midiDeviceAttachedListener = null; private OnMidiDeviceDetachedListener midiDeviceDetachedListener = null; private boolean isRunning = false; protected abstract void onStart(); @Override public int onStartCommand(Intent intent, int flags, int startId) { if (!isRunning) { Log.d(Constants.TAG, "MIDI service starting."); onStart(); isRunning = true; } return START_REDELIVER_INTENT; // must be restarted if stopped by the system, We must respond to midi events(!) } @Override public void onDestroy() { super.onDestroy(); midiInputDevices.clear(); midiOutputDevices.clear(); Log.d(Constants.TAG, "MIDI service stopped."); } /** * Set {@link jp.kshoji.blemidi.listener.OnMidiDeviceDetachedListener} to listen MIDI devices have been connected * * @param midiDeviceAttachedListener the event listener */ public void setOnMidiDeviceAttachedListener(@Nullable OnMidiDeviceAttachedListener midiDeviceAttachedListener) { this.midiDeviceAttachedListener = midiDeviceAttachedListener; } /** * Set {@link jp.kshoji.blemidi.listener.OnMidiDeviceDetachedListener} to listen MIDI devices have been disconnected * * @param midiDeviceDetachedListener the event listener */ public void setOnMidiDeviceDetachedListener(@Nullable OnMidiDeviceDetachedListener midiDeviceDetachedListener) { this.midiDeviceDetachedListener = midiDeviceDetachedListener; } /** * Get {@link java.util.Set} of{@link jp.kshoji.blemidi.device.MidiInputDevice} to send MIDI events. * * @return the Set of MidiInputDevice */ @NonNull public Set<MidiInputDevice> getMidiInputDevices() { return Collections.unmodifiableSet(midiInputDevices); } /** * Get {@link java.util.Set} of{@link jp.kshoji.blemidi.device.MidiOutputDevice} to send MIDI events. * * @return the Set of MidiOutputDevice */ @NonNull public Set<MidiOutputDevice> getMidiOutputDevices() { return Collections.unmodifiableSet(midiOutputDevices); } protected OnMidiDeviceAttachedListener serviceMidiDeviceAttachedListener = new OnMidiDeviceAttachedListener() { @Override public void onMidiInputDeviceAttached(@NonNull MidiInputDevice midiInputDevice) { midiInputDevices.add(midiInputDevice); if (midiDeviceAttachedListener != null) { midiDeviceAttachedListener.onMidiInputDeviceAttached(midiInputDevice); } } @Override public void onMidiOutputDeviceAttached(@NonNull MidiOutputDevice midiOutputDevice) { midiOutputDevices.add(midiOutputDevice); if (midiDeviceAttachedListener != null) { midiDeviceAttachedListener.onMidiOutputDeviceAttached(midiOutputDevice); } } }; protected OnMidiDeviceDetachedListener serviceMidiDeviceDetachedListener = new OnMidiDeviceDetachedListener() { @Override public void onMidiInputDeviceDetached(@NonNull MidiInputDevice midiInputDevice) { midiInputDevice.setOnMidiInputEventListener(null); midiInputDevices.remove(midiInputDevice); if (midiDeviceDetachedListener != null) { midiDeviceDetachedListener.onMidiInputDeviceDetached(midiInputDevice); } } @Override public void onMidiOutputDeviceDetached(@NonNull MidiOutputDevice midiOutputDevice) { midiOutputDevices.remove(midiOutputDevice); if (midiDeviceDetachedListener != null) { midiDeviceDetachedListener.onMidiOutputDeviceDetached(midiOutputDevice); } } }; }