1f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood/*
2f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * Copyright (C) 2015 The Android Open Source Project
3f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood *
4f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * you may not use this file except in compliance with the License.
6f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * You may obtain a copy of the License at
7f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood *
8f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood *
10f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * Unless required by applicable law or agreed to in writing, software
11f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * See the License for the specific language governing permissions and
14f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood * limitations under the License.
15f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood */
16f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
17f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodpackage com.android.bluetoothmidiservice;
18f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
19f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport android.app.Service;
20f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport android.bluetooth.BluetoothDevice;
21f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport android.content.Intent;
227cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burkimport android.media.midi.IBluetoothMidiService;
23f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport android.media.midi.MidiManager;
24f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport android.os.IBinder;
25f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport android.util.Log;
26f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
27f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodimport java.util.HashMap;
28f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
29f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwoodpublic class BluetoothMidiService extends Service {
30f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    private static final String TAG = "BluetoothMidiService";
31f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
32f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    // BluetoothMidiDevices keyed by BluetoothDevice
33f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    private final HashMap<BluetoothDevice,BluetoothMidiDevice> mDeviceServerMap
34f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            = new HashMap<BluetoothDevice,BluetoothMidiDevice>();
35f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
36f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    @Override
37f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    public IBinder onBind(Intent intent) {
387cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk        // Return the interface
397cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk        return mBinder;
407cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk    }
417cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk
427cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk
437cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk    private final IBluetoothMidiService.Stub mBinder = new IBluetoothMidiService.Stub() {
447cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk
457cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk        public IBinder addBluetoothDevice(BluetoothDevice bluetoothDevice) {
467cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk            BluetoothMidiDevice device;
47f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            if (bluetoothDevice == null) {
487cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk                Log.e(TAG, "no BluetoothDevice in addBluetoothDevice()");
49f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood                return null;
50f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            }
51f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            synchronized (mDeviceServerMap) {
52f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood                device = mDeviceServerMap.get(bluetoothDevice);
53f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood                if (device == null) {
547cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk                    device = new BluetoothMidiDevice(BluetoothMidiService.this,
557cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk                            bluetoothDevice, BluetoothMidiService.this);
56e5f722e55c5708c2b48b8c9688c135e451225032Phil Burk                    mDeviceServerMap.put(bluetoothDevice, device);
57f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood                }
58f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            }
59f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            return device.getBinder();
60f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood        }
617cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk
627cd06c0b9e087a555d2c5dd4cab5b7eac8497526Phil Burk    };
63f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood
64f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    void deviceClosed(BluetoothDevice device) {
65f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood        synchronized (mDeviceServerMap) {
66f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood            mDeviceServerMap.remove(device);
67f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood        }
68f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood    }
69f0a41d1c591193fbe02c9ddbaf24c79af4da9972Mike Lockwood}
70