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