ProfileService.java revision b5cc776c9353a203cdde97e62b25f05d9633d14c
1b5cc776c9353a203cdde97e62b25f05d9633d14cfredcpackage com.android.bluetooth.btservice;
2b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
3b5cc776c9353a203cdde97e62b25f05d9633d14cfredcimport android.app.Service;
4b5cc776c9353a203cdde97e62b25f05d9633d14cfredcimport android.bluetooth.BluetoothAdapter;
5b5cc776c9353a203cdde97e62b25f05d9633d14cfredcimport android.content.Intent;
6b5cc776c9353a203cdde97e62b25f05d9633d14cfredcimport android.content.pm.PackageManager;
7b5cc776c9353a203cdde97e62b25f05d9633d14cfredcimport android.os.IBinder;
8b5cc776c9353a203cdde97e62b25f05d9633d14cfredcimport android.util.Log;
9b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
10b5cc776c9353a203cdde97e62b25f05d9633d14cfredcpublic abstract class ProfileService extends Service {
11b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public static final String BLUETOOTH_ADMIN_PERM =
12b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            android.Manifest.permission.BLUETOOTH_ADMIN;
13b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
14b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
15b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected BluetoothAdapter mAdapter;
16b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected String mName;
17b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
18b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected String getName() {
19b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        return getClass().getSimpleName();
20b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
21b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
22b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public abstract IBinder onBind(Intent intent);
23b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected abstract boolean start();
24b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected abstract boolean stop();
25b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
26b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public boolean mStartError=false;
27b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    @Override
28b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public void onCreate() {
29b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        mName = getName();
30b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (mName == null) {
31b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            mName = "UnknownProfileService";
32b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
33b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
34b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        log("onCreate");
35b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        super.onCreate();
36b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        mAdapter = BluetoothAdapter.getDefaultAdapter();
37b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
38b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        //Start service
39b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (mAdapter == null) {
40b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            Log.e(mName, "Error starting profile. BluetoothAdapter is null");
41b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        } else {
42b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            mStartError = !start();
43b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            if (!mStartError) {
44b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                notifyProfileOn();
45b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            } else {
46b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                Log.e(mName, "Error starting profile. BluetoothAdapter is null");
47b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            }
48b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
49b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
50b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
51b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public void onStart(Intent intent, int startId) {
52b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        log("onStart");
53b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
54b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (mStartError || mAdapter == null) {
55b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            Log.w(mName, "Stopping profile service: device does not have BT");
56b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            doStop();
57b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            return;
58b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
59b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
60b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (checkCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM)!=PackageManager.PERMISSION_GRANTED) {
61b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            Log.e(mName, "Permission denied!");
62b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            return;
63b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
64b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
65b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        String action = intent.getStringExtra(AdapterService.EXTRA_ACTION);
66b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (AdapterService.ACTION_SERVICE_STATE_CHANGED.equals(action)) {
67b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            int state= intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
68b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            if(state==BluetoothAdapter.STATE_OFF) {
69b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                Log.d(mName, "Received stop request...Stopping profile...");
70b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                doStop();
71b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            }
72b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
73b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
74b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
75b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    @Override
76b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    public void onDestroy() {
77b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        super.onDestroy();
78b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        mAdapter = null;
79b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        log("Destroying service.");
80b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
81b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
82b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    private void doStop() {
83b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (stop()) {
84b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            notifyProfileOff();
85b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            stopSelf();
86b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        } else {
87b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            Log.e(mName, "Unable to stop profile");
88b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
89b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
90b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
91b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected void notifyProfileOn() {
92b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        //Notify adapter service
93b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        AdapterService sAdapter = AdapterService.getAdapterService();
94b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (sAdapter!= null) {
95b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            sAdapter.onProfileServiceStateChanged(getClass().getName(), BluetoothAdapter.STATE_ON);
96b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
97b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
98b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
99b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected void notifyProfileOff() {
100b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        //Notify adapter service
101b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        AdapterService sAdapter = AdapterService.getAdapterService();
102b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        if (sAdapter!= null) {
103b5cc776c9353a203cdde97e62b25f05d9633d14cfredc            sAdapter.onProfileServiceStateChanged(getClass().getName(), BluetoothAdapter.STATE_OFF);
104b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        }
105b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
106b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
107b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    protected void log(String msg) {
108b5cc776c9353a203cdde97e62b25f05d9633d14cfredc        Log.d(mName, msg);
109b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
110b5cc776c9353a203cdde97e62b25f05d9633d14cfredc}
111