summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java')
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java383
1 files changed, 0 insertions, 383 deletions
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
deleted file mode 100644
index 2a6a759..0000000
--- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 2011 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.android.settings.bluetooth;
-
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothMap;
-import android.bluetooth.BluetoothInputDevice;
-import android.bluetooth.BluetoothPan;
-import android.bluetooth.BluetoothPbap;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
-import android.content.Context;
-import android.content.Intent;
-import android.os.ParcelUuid;
-import android.util.Log;
-import android.os.Handler;
-import android.os.Message;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.List;
-
-/**
- * LocalBluetoothProfileManager provides access to the LocalBluetoothProfile
- * objects for the available Bluetooth profiles.
- */
-final class LocalBluetoothProfileManager {
- private static final String TAG = "LocalBluetoothProfileManager";
- private static final boolean DEBUG = Utils.D;
- /** Singleton instance. */
- private static LocalBluetoothProfileManager sInstance;
-
- /**
- * An interface for notifying BluetoothHeadset IPC clients when they have
- * been connected to the BluetoothHeadset service.
- * Only used by {@link DockService}.
- */
- public interface ServiceListener {
- /**
- * Called to notify the client when this proxy object has been
- * connected to the BluetoothHeadset service. Clients must wait for
- * this callback before making IPC calls on the BluetoothHeadset
- * service.
- */
- void onServiceConnected();
-
- /**
- * Called to notify the client that this proxy object has been
- * disconnected from the BluetoothHeadset service. Clients must not
- * make IPC calls on the BluetoothHeadset service after this callback.
- * This callback will currently only occur if the application hosting
- * the BluetoothHeadset service, but may be called more often in future.
- */
- void onServiceDisconnected();
- }
-
- private final Context mContext;
- private final LocalBluetoothAdapter mLocalAdapter;
- private final CachedBluetoothDeviceManager mDeviceManager;
- private final BluetoothEventManager mEventManager;
-
- private A2dpProfile mA2dpProfile;
- private HeadsetProfile mHeadsetProfile;
- private MapProfile mMapProfile;
- private final HidProfile mHidProfile;
- private OppProfile mOppProfile;
- private final PanProfile mPanProfile;
- private final PbapServerProfile mPbapProfile;
-
- /**
- * Mapping from profile name, e.g. "HEADSET" to profile object.
- */
- private final Map<String, LocalBluetoothProfile>
- mProfileNameMap = new HashMap<String, LocalBluetoothProfile>();
-
- LocalBluetoothProfileManager(Context context,
- LocalBluetoothAdapter adapter,
- CachedBluetoothDeviceManager deviceManager,
- BluetoothEventManager eventManager) {
- mContext = context;
-
- mLocalAdapter = adapter;
- mDeviceManager = deviceManager;
- mEventManager = eventManager;
- // pass this reference to adapter and event manager (circular dependency)
- mLocalAdapter.setProfileManager(this);
- mEventManager.setProfileManager(this);
-
- ParcelUuid[] uuids = adapter.getUuids();
-
- // uuids may be null if Bluetooth is turned off
- if (uuids != null) {
- updateLocalProfiles(uuids);
- }
-
- // Always add HID and PAN profiles
- mHidProfile = new HidProfile(context, mLocalAdapter, mDeviceManager, this);
- addProfile(mHidProfile, HidProfile.NAME,
- BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED);
-
- mPanProfile = new PanProfile(context);
- addPanProfile(mPanProfile, PanProfile.NAME,
- BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
-
- if(DEBUG) Log.d(TAG, "Adding local MAP profile");
- mMapProfile = new MapProfile(mContext, mLocalAdapter,
- mDeviceManager, this);
- addProfile(mMapProfile, MapProfile.NAME,
- BluetoothMap.ACTION_CONNECTION_STATE_CHANGED);
-
- //Create PBAP server profile, but do not add it to list of profiles
- // as we do not need to monitor the profile as part of profile list
- mPbapProfile = new PbapServerProfile(context);
-
- if (DEBUG) Log.d(TAG, "LocalBluetoothProfileManager construction complete");
- }
-
- /**
- * Initialize or update the local profile objects. If a UUID was previously
- * present but has been removed, we print a warning but don't remove the
- * profile object as it might be referenced elsewhere, or the UUID might
- * come back and we don't want multiple copies of the profile objects.
- * @param uuids
- */
- void updateLocalProfiles(ParcelUuid[] uuids) {
- // A2DP
- if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.AudioSource)) {
- if (mA2dpProfile == null) {
- if(DEBUG) Log.d(TAG, "Adding local A2DP profile");
- mA2dpProfile = new A2dpProfile(mContext, mLocalAdapter, mDeviceManager, this);
- addProfile(mA2dpProfile, A2dpProfile.NAME,
- BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
- }
- } else if (mA2dpProfile != null) {
- Log.w(TAG, "Warning: A2DP profile was previously added but the UUID is now missing.");
- }
-
- // Headset / Handsfree
- if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Handsfree_AG) ||
- BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.HSP_AG)) {
- if (mHeadsetProfile == null) {
- if (DEBUG) Log.d(TAG, "Adding local HEADSET profile");
- mHeadsetProfile = new HeadsetProfile(mContext, mLocalAdapter,
- mDeviceManager, this);
- addProfile(mHeadsetProfile, HeadsetProfile.NAME,
- BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
- }
- } else if (mHeadsetProfile != null) {
- Log.w(TAG, "Warning: HEADSET profile was previously added but the UUID is now missing.");
- }
-
- // OPP
- if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.ObexObjectPush)) {
- if (mOppProfile == null) {
- if(DEBUG) Log.d(TAG, "Adding local OPP profile");
- mOppProfile = new OppProfile();
- // Note: no event handler for OPP, only name map.
- mProfileNameMap.put(OppProfile.NAME, mOppProfile);
- }
- } else if (mOppProfile != null) {
- Log.w(TAG, "Warning: OPP profile was previously added but the UUID is now missing.");
- }
- mEventManager.registerProfileIntentReceiver();
-
- // There is no local SDP record for HID and Settings app doesn't control PBAP
- }
-
- private final Collection<ServiceListener> mServiceListeners =
- new ArrayList<ServiceListener>();
-
- private void addProfile(LocalBluetoothProfile profile,
- String profileName, String stateChangedAction) {
- mEventManager.addProfileHandler(stateChangedAction, new StateChangedHandler(profile));
- mProfileNameMap.put(profileName, profile);
- }
-
- private void addPanProfile(LocalBluetoothProfile profile,
- String profileName, String stateChangedAction) {
- mEventManager.addProfileHandler(stateChangedAction,
- new PanStateChangedHandler(profile));
- mProfileNameMap.put(profileName, profile);
- }
-
- LocalBluetoothProfile getProfileByName(String name) {
- return mProfileNameMap.get(name);
- }
-
- // Called from LocalBluetoothAdapter when state changes to ON
- void setBluetoothStateOn() {
- ParcelUuid[] uuids = mLocalAdapter.getUuids();
- if (uuids != null) {
- updateLocalProfiles(uuids);
- }
- mEventManager.readPairedDevices();
- }
-
- /**
- * Generic handler for connection state change events for the specified profile.
- */
- private class StateChangedHandler implements BluetoothEventManager.Handler {
- final LocalBluetoothProfile mProfile;
-
- StateChangedHandler(LocalBluetoothProfile profile) {
- mProfile = profile;
- }
-
- public void onReceive(Context context, Intent intent, BluetoothDevice device) {
- CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(device);
- if (cachedDevice == null) {
- Log.w(TAG, "StateChangedHandler found new device: " + device);
- cachedDevice = mDeviceManager.addDevice(mLocalAdapter,
- LocalBluetoothProfileManager.this, device);
- }
- int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, 0);
- int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, 0);
- if (newState == BluetoothProfile.STATE_DISCONNECTED &&
- oldState == BluetoothProfile.STATE_CONNECTING) {
- Log.i(TAG, "Failed to connect " + mProfile + " device");
- }
-
- cachedDevice.onProfileStateChanged(mProfile, newState);
- cachedDevice.refresh();
- }
- }
-
- /** State change handler for NAP and PANU profiles. */
- private class PanStateChangedHandler extends StateChangedHandler {
-
- PanStateChangedHandler(LocalBluetoothProfile profile) {
- super(profile);
- }
-
- @Override
- public void onReceive(Context context, Intent intent, BluetoothDevice device) {
- PanProfile panProfile = (PanProfile) mProfile;
- int role = intent.getIntExtra(BluetoothPan.EXTRA_LOCAL_ROLE, 0);
- panProfile.setLocalRole(device, role);
- super.onReceive(context, intent, device);
- }
- }
-
- // called from DockService
- void addServiceListener(ServiceListener l) {
- mServiceListeners.add(l);
- }
-
- // called from DockService
- void removeServiceListener(ServiceListener l) {
- mServiceListeners.remove(l);
- }
-
- // not synchronized: use only from UI thread! (TODO: verify)
- void callServiceConnectedListeners() {
- for (ServiceListener l : mServiceListeners) {
- l.onServiceConnected();
- }
- }
-
- // not synchronized: use only from UI thread! (TODO: verify)
- void callServiceDisconnectedListeners() {
- for (ServiceListener listener : mServiceListeners) {
- listener.onServiceDisconnected();
- }
- }
-
- // This is called by DockService, so check Headset and A2DP.
- public synchronized boolean isManagerReady() {
- // Getting just the headset profile is fine for now. Will need to deal with A2DP
- // and others if they aren't always in a ready state.
- LocalBluetoothProfile profile = mHeadsetProfile;
- if (profile != null) {
- return profile.isProfileReady();
- }
- profile = mA2dpProfile;
- if (profile != null) {
- return profile.isProfileReady();
- }
- return false;
- }
-
- A2dpProfile getA2dpProfile() {
- return mA2dpProfile;
- }
-
- HeadsetProfile getHeadsetProfile() {
- return mHeadsetProfile;
- }
-
- PbapServerProfile getPbapProfile(){
- return mPbapProfile;
- }
-
- MapProfile getMapProfile(){
- return mMapProfile;
- }
-
- /**
- * Fill in a list of LocalBluetoothProfile objects that are supported by
- * the local device and the remote device.
- *
- * @param uuids of the remote device
- * @param localUuids UUIDs of the local device
- * @param profiles The list of profiles to fill
- * @param removedProfiles list of profiles that were removed
- */
- synchronized void updateProfiles(ParcelUuid[] uuids, ParcelUuid[] localUuids,
- Collection<LocalBluetoothProfile> profiles,
- Collection<LocalBluetoothProfile> removedProfiles,
- boolean isPanNapConnected, BluetoothDevice device) {
- // Copy previous profile list into removedProfiles
- removedProfiles.clear();
- removedProfiles.addAll(profiles);
- profiles.clear();
-
- if (uuids == null) {
- return;
- }
-
- if (mHeadsetProfile != null) {
- if ((BluetoothUuid.isUuidPresent(localUuids, BluetoothUuid.HSP_AG) &&
- BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.HSP)) ||
- (BluetoothUuid.isUuidPresent(localUuids, BluetoothUuid.Handsfree_AG) &&
- BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Handsfree))) {
- profiles.add(mHeadsetProfile);
- removedProfiles.remove(mHeadsetProfile);
- }
- }
-
- if (BluetoothUuid.containsAnyUuid(uuids, A2dpProfile.SINK_UUIDS) &&
- mA2dpProfile != null) {
- profiles.add(mA2dpProfile);
- removedProfiles.remove(mA2dpProfile);
- }
-
- if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.ObexObjectPush) &&
- mOppProfile != null) {
- profiles.add(mOppProfile);
- removedProfiles.remove(mOppProfile);
- }
-
- if ((BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Hid) ||
- BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Hogp)) &&
- mHidProfile != null) {
- profiles.add(mHidProfile);
- removedProfiles.remove(mHidProfile);
- }
-
- if(isPanNapConnected)
- if(DEBUG) Log.d(TAG, "Valid PAN-NAP connection exists.");
- if ((BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.NAP) &&
- mPanProfile != null) || isPanNapConnected) {
- profiles.add(mPanProfile);
- removedProfiles.remove(mPanProfile);
- }
-
- if ((mMapProfile != null) &&
- (mMapProfile.getConnectionStatus(device) == BluetoothProfile.STATE_CONNECTED)) {
- profiles.add(mMapProfile);
- removedProfiles.remove(mMapProfile);
- mMapProfile.setPreferred(device, true);
- }
- }
-
-}