Merge "Refactor BluetoothPbap APIs used by Settings"

This commit is contained in:
Treehugger Robot
2019-12-17 01:53:24 +00:00
committed by Gerrit Code Review
3 changed files with 68 additions and 56 deletions

View File

@@ -1418,6 +1418,11 @@ package android.bluetooth {
field public static final int REMOTE_PANU_ROLE = 2; // 0x2
}
public class BluetoothPbap implements android.bluetooth.BluetoothProfile {
method public int getConnectionState(@Nullable android.bluetooth.BluetoothDevice);
field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
}
public interface BluetoothProfile {
field public static final int CONNECTION_POLICY_ALLOWED = 100; // 0x64
field public static final int CONNECTION_POLICY_FORBIDDEN = 0; // 0x0

View File

@@ -16,7 +16,10 @@
package android.bluetooth;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
@@ -54,6 +57,7 @@ import java.util.List;
*
* @hide
*/
@SystemApi
public class BluetoothPbap implements BluetoothProfile {
private static final String TAG = "BluetoothPbap";
@@ -75,7 +79,11 @@ public class BluetoothPbap implements BluetoothProfile {
* {@link BluetoothProfile#STATE_DISCONNECTING}.
* <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to
* receive.
*
* @hide
*/
@SuppressLint("ActionValue")
@SystemApi
@SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_CONNECTION_STATE_CHANGED =
"android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
@@ -85,33 +93,16 @@ public class BluetoothPbap implements BluetoothProfile {
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
/** @hide */
public static final int RESULT_FAILURE = 0;
/** @hide */
public static final int RESULT_SUCCESS = 1;
/** Connection canceled before completion. */
public static final int RESULT_CANCELED = 2;
/**
* An interface for notifying Bluetooth PCE IPC clients when they have
* been connected to the BluetoothPbap service.
* Connection canceled before completion.
*
* @hide
*/
public interface ServiceListener {
/**
* Called to notify the client when this proxy object has been
* connected to the BluetoothPbap service. Clients must wait for
* this callback before making IPC calls on the BluetoothPbap
* service.
*/
public void onServiceConnected(BluetoothPbap proxy);
/**
* Called to notify the client that this proxy object has been
* disconnected from the BluetoothPbap service. Clients must not
* make IPC calls on the BluetoothPbap service after this callback.
* This callback will currently only occur if the application hosting
* the BluetoothPbap service, but may be called more often in future.
*/
public void onServiceDisconnected();
}
public static final int RESULT_CANCELED = 2;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
new IBluetoothStateChangeCallback.Stub() {
@@ -127,6 +118,8 @@ public class BluetoothPbap implements BluetoothProfile {
/**
* Create a BluetoothPbap proxy object.
*
* @hide
*/
public BluetoothPbap(Context context, ServiceListener l) {
mContext = context;
@@ -181,6 +174,7 @@ public class BluetoothPbap implements BluetoothProfile {
}
}
/** @hide */
protected void finalize() throws Throwable {
try {
close();
@@ -194,6 +188,8 @@ public class BluetoothPbap implements BluetoothProfile {
* Other public functions of BluetoothPbap will return default error
* results once close() has been called. Multiple invocations of close()
* are ok.
*
* @hide
*/
public synchronized void close() {
IBluetoothManager mgr = mAdapter.getBluetoothManager();
@@ -210,6 +206,8 @@ public class BluetoothPbap implements BluetoothProfile {
/**
* {@inheritDoc}
*
* @hide
*/
@Override
public List<BluetoothDevice> getConnectedDevices() {
@@ -229,17 +227,22 @@ public class BluetoothPbap implements BluetoothProfile {
/**
* {@inheritDoc}
*
* @hide
*/
@SystemApi
@Override
public int getConnectionState(BluetoothDevice device) {
public int getConnectionState(@Nullable BluetoothDevice device) {
log("getConnectionState: device=" + device);
final IBluetoothPbap service = mService;
if (service == null) {
Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
try {
return service.getConnectionState(device);
final IBluetoothPbap service = mService;
if (service != null && isEnabled() && isValidDevice(device)) {
return service.getConnectionState(device);
}
if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return BluetoothProfile.STATE_DISCONNECTED;
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -248,6 +251,8 @@ public class BluetoothPbap implements BluetoothProfile {
/**
* {@inheritDoc}
*
* @hide
*/
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
@@ -265,23 +270,13 @@ public class BluetoothPbap implements BluetoothProfile {
return new ArrayList<BluetoothDevice>();
}
/**
* Returns true if the specified Bluetooth device is connected (does not
* include connecting). Returns false if not connected, or if this proxy
* object is not currently connected to the Pbap service.
*/
// TODO: This is currently being used by SettingsLib and internal app.
public boolean isConnected(BluetoothDevice device) {
return getConnectionState(device) == BluetoothAdapter.STATE_CONNECTED;
}
/**
* Disconnects the current Pbap client (PCE). Currently this call blocks,
* it may soon be made asynchronous. Returns false if this proxy object is
* not currently connected to the Pbap service.
*
* @hide
*/
// TODO: This is currently being used by SettingsLib and will be used in the future.
// TODO: Must specify target device. Implement this in the service.
@UnsupportedAppUsage
public boolean disconnect(BluetoothDevice device) {
log("disconnect()");
@@ -304,7 +299,7 @@ public class BluetoothPbap implements BluetoothProfile {
log("Proxy object connected");
mService = IBluetoothPbap.Stub.asInterface(service);
if (mServiceListener != null) {
mServiceListener.onServiceConnected(BluetoothPbap.this);
mServiceListener.onServiceConnected(BluetoothProfile.PBAP, BluetoothPbap.this);
}
}
@@ -312,11 +307,23 @@ public class BluetoothPbap implements BluetoothProfile {
log("Proxy object disconnected");
doUnbind();
if (mServiceListener != null) {
mServiceListener.onServiceDisconnected();
mServiceListener.onServiceDisconnected(BluetoothProfile.PBAP);
}
}
};
private boolean isEnabled() {
if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
return false;
}
private boolean isValidDevice(BluetoothDevice device) {
if (device == null) return false;
if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
return false;
}
private static void log(String msg) {
if (DBG) {
Log.d(TAG, msg);

View File

@@ -16,6 +16,7 @@
package com.android.settingslib.bluetooth;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothPbap;
@@ -52,14 +53,16 @@ public class PbapServerProfile implements LocalBluetoothProfile {
// These callbacks run on the main thread.
private final class PbapServiceListener
implements BluetoothPbap.ServiceListener {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(BluetoothPbap proxy) {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
mService = (BluetoothPbap) proxy;
mIsProfileReady=true;
}
public void onServiceDisconnected() {
@Override
public void onServiceDisconnected(int profile) {
mIsProfileReady=false;
}
}
@@ -74,7 +77,8 @@ public class PbapServerProfile implements LocalBluetoothProfile {
}
PbapServerProfile(Context context) {
BluetoothPbap pbap = new BluetoothPbap(context, new PbapServiceListener());
BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, new PbapServiceListener(),
BluetoothProfile.PBAP);
}
public boolean accessProfileEnabled() {
@@ -97,13 +101,8 @@ public class PbapServerProfile implements LocalBluetoothProfile {
}
public int getConnectionStatus(BluetoothDevice device) {
if (mService == null) {
return BluetoothProfile.STATE_DISCONNECTED;
}
if (mService.isConnected(device))
return BluetoothProfile.STATE_CONNECTED;
else
return BluetoothProfile.STATE_DISCONNECTED;
if (mService == null) return BluetoothProfile.STATE_DISCONNECTED;
return mService.getConnectionState(device);
}
public boolean isPreferred(BluetoothDevice device) {
@@ -142,7 +141,8 @@ public class PbapServerProfile implements LocalBluetoothProfile {
Log.d(TAG, "finalize()");
if (mService != null) {
try {
mService.close();
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.PBAP,
mService);
mService = null;
}catch (Throwable t) {
Log.w(TAG, "Error cleaning up PBAP proxy", t);