aboutsummaryrefslogtreecommitdiff
path: root/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java
blob: e3fe007b8153040520a6da117020ff09010f5206 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.googlecode.android_scripting.facade.bluetooth;

import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothMap;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.os.ParcelUuid;

import com.googlecode.android_scripting.Log;
import com.googlecode.android_scripting.facade.FacadeManager;
import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
import com.googlecode.android_scripting.rpc.Rpc;
import com.googlecode.android_scripting.rpc.RpcParameter;

import java.util.List;

public class BluetoothMapFacade extends RpcReceiver {
    static final ParcelUuid[] MAP_UUIDS = {
        BluetoothUuid.MAP,
        BluetoothUuid.MNS,
        BluetoothUuid.MAS,
    };
    private final Service mService;
    private final BluetoothAdapter mBluetoothAdapter;

    private static boolean sIsMapReady = false;
    private static BluetoothMap sMapProfile = null;

    public BluetoothMapFacade(FacadeManager manager) {
        super(manager);
        mService = manager.getService();
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mBluetoothAdapter.getProfileProxy(mService, new MapServiceListener(),
        BluetoothProfile.MAP);
    }

    class MapServiceListener implements BluetoothProfile.ServiceListener {
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            sMapProfile = (BluetoothMap) proxy;
            sIsMapReady = true;
        }

        @Override
        public void onServiceDisconnected(int profile) {
            sIsMapReady = false;
        }
    }

    /**
     * Disconnect Map Profile.
     * @param device - the BluetoothDevice object to connect to.
     * @return if the disconnection was successfull or not.
     */
    public Boolean mapDisconnect(BluetoothDevice device) {
        if (sMapProfile.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
            sMapProfile.setPriority(device, BluetoothProfile.PRIORITY_ON);
        }
        return sMapProfile.disconnect(device);
    }

    /**
     * Is Map profile ready.
     * @return if Map profile is ready or not.
     */
    @Rpc(description = "Is Map profile ready.")
    public Boolean bluetoothMapIsReady() {
    return sIsMapReady;
    }

    /**
     * Disconnect an MAP device.
     * @param deviceID - Name or MAC address of a bluetooth device.
     * @return True if the disconnection was successful; otherwise False.
     */
    @Rpc(description = "Disconnect an MAP device.")
    public Boolean bluetoothMapDisconnect(
            @RpcParameter(name = "deviceID",
                description = "Name or MAC address of a device.")
                    String deviceID) throws Exception {
        if (sMapProfile == null) return false;
        List<BluetoothDevice> connectedMapDevices =
                sMapProfile.getConnectedDevices();
        Log.d("Connected map devices: " + connectedMapDevices);
        BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedMapDevices, deviceID);
        if (!connectedMapDevices.isEmpty()
                && connectedMapDevices.get(0).equals(mDevice)) {
            if (sMapProfile.getPriority(mDevice)
                    > BluetoothProfile.PRIORITY_ON) {
                sMapProfile.setPriority(mDevice, BluetoothProfile.PRIORITY_ON);
            }
            return sMapProfile.disconnect(mDevice);
        } else {
            return false;
        }
    }

    /**
     * Get all the devices connected through MAP.
     * @return List of all the devices connected through MAP.
     */
    @Rpc(description = "Get all the devices connected through MAP.")
    public List<BluetoothDevice> bluetoothMapGetConnectedDevices() {
        if (!sIsMapReady) return null;
        return sMapProfile.getDevicesMatchingConnectionStates(
                new int[] {BluetoothProfile.STATE_CONNECTED,
                    BluetoothProfile.STATE_CONNECTING,
                    BluetoothProfile.STATE_DISCONNECTING});
    }

    /**
     * Get the currently connected remote Bluetooth device (PCE).
     * @return remote Bluetooth device which is currently conencted.
     */
    @Rpc(description =
            "Get the currently connected remote Bluetooth device (PCE).")
    public BluetoothDevice bluetoothMapGetClient() {
        if (sMapProfile == null) return null;
        return sMapProfile.getClient();
    }

    @Override
    public void shutdown() {
    }
}