1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Copyright (C) 2011 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings.bluetooth;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
215469ff8b3f9966c6f141078b37da5f178b7825e4Michael Chan
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * LocalBluetoothManager provides a simplified interface on top of a subset of
24436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * the Bluetooth API. Note that {@link #getInstance} will return null
25436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * if there is no Bluetooth adapter on this device, and callers must be
26436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * prepared to handle this case.
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
28436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambypublic final class LocalBluetoothManager {
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG = "LocalBluetoothManager";
3091b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
31dd79a33ba53fec530094f4d2fe37f0538530d9f8Jake Hamby    /** Singleton instance. */
3248e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    private static LocalBluetoothManager sInstance;
3391b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
34436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private final Context mContext;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
36436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    /** If a BT-related activity is in the foreground, this will be it. */
37436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private Context mForegroundActivity;
385469ff8b3f9966c6f141078b37da5f178b7825e4Michael Chan
39e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim    private BluetoothDiscoverableEnabler mDiscoverableEnabler;
40e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim
41436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private final LocalBluetoothAdapter mLocalAdapter;
425469ff8b3f9966c6f141078b37da5f178b7825e4Michael Chan
43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private final CachedBluetoothDeviceManager mCachedDeviceManager;
44d617a0781cd1a39ed0f726545ed23d5b00ca31c2Michael Chan
45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    /** The Bluetooth profile manager. */
46436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private final LocalBluetoothProfileManager mProfileManager;
4791b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
48436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    /** The broadcast receiver event manager. */
49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private final BluetoothEventManager mEventManager;
50c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby
51436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public static synchronized LocalBluetoothManager getInstance(Context context) {
52436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (sInstance == null) {
53436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            LocalBluetoothAdapter adapter = LocalBluetoothAdapter.getInstance();
54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (adapter == null) {
55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                return null;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
57436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            // This will be around as long as this process is
58436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            Context appContext = context.getApplicationContext();
59436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            sInstance = new LocalBluetoothManager(adapter, appContext);
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
6191b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
62436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return sInstance;
63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
65e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim    public void setDiscoverableEnabler(BluetoothDiscoverableEnabler discoverableEnabler) {
66e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim        mDiscoverableEnabler = discoverableEnabler;
67e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim    }
68e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim
69e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim    public BluetoothDiscoverableEnabler getDiscoverableEnabler() {
70e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim        return mDiscoverableEnabler;
71e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim    }
72e96f04c1ffaa99992f9ed4c2687db0b955ae0450jhtop.kim
73436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private LocalBluetoothManager(LocalBluetoothAdapter adapter, Context context) {
74436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mContext = context;
75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mLocalAdapter = adapter;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
77b707255a440e53ec2865c4b34c7ea07d16d471bdMatthew Xie        mCachedDeviceManager = new CachedBluetoothDeviceManager(context);
78436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mEventManager = new BluetoothEventManager(mLocalAdapter,
796eb84ac6de9eeacc1e199d74310cf91f5a98daf2Jaikumar Ganesh                mCachedDeviceManager, context);
80436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mProfileManager = new LocalBluetoothProfileManager(context,
81436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                mLocalAdapter, mCachedDeviceManager, mEventManager);
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
8391b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
84436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public LocalBluetoothAdapter getBluetoothAdapter() {
85436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mLocalAdapter;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
8791b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public Context getContext() {
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return mContext;
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
92bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim    public Context getForegroundActivity() {
93bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim        return mForegroundActivity;
94bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim    }
95bb16e15de32f14c25728db39494c0cff9b80d186jhtop.kim
96436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    boolean isForegroundActivity() {
97436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mForegroundActivity != null;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
9991b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
100436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    synchronized void setForegroundActivity(Context context) {
101436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (context != null) {
102436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            Log.d(TAG, "setting foreground activity to non-null context");
103436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mForegroundActivity = context;
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
105436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (mForegroundActivity != null) {
106436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                Log.d(TAG, "setting foreground activity to null");
107436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                mForegroundActivity = null;
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
11191b33f14620519e15507e62192701abed29179a1Jaikumar Ganesh
112436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    CachedBluetoothDeviceManager getCachedDeviceManager() {
113436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDeviceManager;
114d617a0781cd1a39ed0f726545ed23d5b00ca31c2Michael Chan    }
115d617a0781cd1a39ed0f726545ed23d5b00ca31c2Michael Chan
116436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    BluetoothEventManager getEventManager() {
117436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mEventManager;
118d617a0781cd1a39ed0f726545ed23d5b00ca31c2Michael Chan    }
119d617a0781cd1a39ed0f726545ed23d5b00ca31c2Michael Chan
120436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    LocalBluetoothProfileManager getProfileManager() {
121436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mProfileManager;
122d617a0781cd1a39ed0f726545ed23d5b00ca31c2Michael Chan    }
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
124