Loading android/app/src/com/android/bluetooth/hfpclient/connserv/BluetoothHeadsetClientProxy.java 0 → 100644 +102 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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 android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.os.Bundle; import java.util.List; /** * A mockable proxy class that facilitates testing of the {@code hfpclient.connserv} package. * * <p>This is necessary due to the "final" attribute of the BluetoothHeadsetClient class. */ public class BluetoothHeadsetClientProxy { private final BluetoothHeadsetClient mBluetoothHeadsetClient; public BluetoothHeadsetClientProxy(BluetoothHeadsetClient bluetoothHeadsetClient) { mBluetoothHeadsetClient = bluetoothHeadsetClient; } public BluetoothHeadsetClient getProxiedBluetoothHeadsetClient() { return mBluetoothHeadsetClient; } /** @see BluetoothHeadsetClient#dial(BluetoothDevice, String) */ public BluetoothHeadsetClientCall dial(BluetoothDevice device, String number) { return mBluetoothHeadsetClient.dial(device, number); } /** @see BluetoothHeadsetClient#enterPrivateMode(BluetoothDevice, int) */ public boolean enterPrivateMode(BluetoothDevice device, int index) { return mBluetoothHeadsetClient.enterPrivateMode(device, index); } /** @see BluetoothHeadsetClient#sendDTMF(BluetoothDevice, byte) */ public boolean sendDTMF(BluetoothDevice device, byte code) { return mBluetoothHeadsetClient.sendDTMF(device, code); } /** @see BluetoothHeadsetClient#terminateCall(BluetoothDevice, BluetoothHeadsetClientCall) */ public boolean terminateCall(BluetoothDevice device, BluetoothHeadsetClientCall call) { return mBluetoothHeadsetClient.terminateCall(device, call); } /** @see BluetoothHeadsetClient#holdCall(BluetoothDevice) */ public boolean holdCall(BluetoothDevice device) { return mBluetoothHeadsetClient.holdCall(device); } /** @see BluetoothHeadsetClient#acceptCall(BluetoothDevice, int) */ public boolean acceptCall(BluetoothDevice device, int flag) { return mBluetoothHeadsetClient.acceptCall(device, flag); } /** @see BluetoothHeadsetClient#rejectCall(BluetoothDevice) */ public boolean rejectCall(BluetoothDevice device) { return mBluetoothHeadsetClient.rejectCall(device); } /** @see BluetoothHeadsetClient#connectAudio(BluetoothDevice) */ public boolean connectAudio(BluetoothDevice device) { return mBluetoothHeadsetClient.connectAudio(device); } /** @see BluetoothHeadsetClient#disconnectAudio(BluetoothDevice) */ public boolean disconnectAudio(BluetoothDevice device) { return mBluetoothHeadsetClient.disconnectAudio(device); } /** @see BluetoothHeadsetClient#getCurrentAgEvents(BluetoothDevice) */ public Bundle getCurrentAgEvents(BluetoothDevice device) { return mBluetoothHeadsetClient.getCurrentAgEvents(device); } /** @see BluetoothHeadsetClient#getConnectedDevices() */ public List<BluetoothDevice> getConnectedDevices() { return mBluetoothHeadsetClient.getConnectedDevices(); } /** @see BluetoothHeadsetClient#getCurrentCalls(BluetoothDevice) */ public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) { return mBluetoothHeadsetClient.getCurrentCalls(device); } } android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientConference.java +3 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.telecom.Conference; import android.telecom.Connection; import android.telecom.PhoneAccountHandle; Loading @@ -26,10 +27,10 @@ public class HfpClientConference extends Conference { private static final String TAG = "HfpClientConference"; private BluetoothDevice mDevice; private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; public HfpClientConference(PhoneAccountHandle handle, BluetoothDevice device, BluetoothHeadsetClient client) { BluetoothHeadsetClientProxy client) { super(handle); mDevice = device; mHeadsetProfile = client; Loading android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientConnection.java +4 −3 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.content.Context; import android.net.Uri; import android.os.Bundle; Loading @@ -40,7 +41,7 @@ public class HfpClientConnection extends Connection { private final Context mContext; private final BluetoothDevice mDevice; private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; private HfpClientConnectionService mHfpClientConnectionService; private BluetoothHeadsetClientCall mCurrentCall; Loading @@ -54,7 +55,7 @@ public class HfpClientConnection extends Connection { // Constructor to be used when there's an existing call (such as that created on the AG or // when connection happens and we see calls for the first time). public HfpClientConnection(Context context, BluetoothDevice device, BluetoothHeadsetClient client, BluetoothHeadsetClientCall call) { BluetoothHeadsetClientProxy client, BluetoothHeadsetClientCall call) { mDevice = device; mContext = context; mHeadsetProfile = client; Loading @@ -72,7 +73,7 @@ public class HfpClientConnection extends Connection { // Constructor to be used when a call is intiated on the HF. The call handle is obtained by // using the dial() command. public HfpClientConnection(Context context, BluetoothDevice device, BluetoothHeadsetClient client, Uri number) { BluetoothHeadsetClientProxy client, Uri number) { mDevice = device; mContext = context; mHeadsetProfile = client; Loading android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientConnectionService.java +8 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.bluetooth.BluetoothProfile; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; Loading Loading @@ -53,7 +54,7 @@ public class HfpClientConnectionService extends ConnectionService { private BluetoothAdapter mAdapter; // BluetoothHeadset proxy. private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; private TelecomManager mTelecomManager; private final Map<BluetoothDevice, HfpClientDeviceBlock> mDeviceBlocks = new HashMap<>(); Loading Loading @@ -145,7 +146,8 @@ public class HfpClientConnectionService extends ConnectionService { } // Close the profile. if (mHeadsetProfile != null) { mAdapter.closeProfileProxy(BluetoothProfile.HEADSET_CLIENT, mHeadsetProfile); mAdapter.closeProfileProxy(BluetoothProfile.HEADSET_CLIENT, mHeadsetProfile.getProxiedBluetoothHeadsetClient()); } // Unregister the broadcast receiver. Loading Loading @@ -286,7 +288,7 @@ public class HfpClientConnectionService extends ConnectionService { if (DBG) { Log.d(TAG, "onServiceConnected"); } mHeadsetProfile = (BluetoothHeadsetClient) proxy; mHeadsetProfile = new BluetoothHeadsetClientProxy((BluetoothHeadsetClient) proxy); List<BluetoothDevice> devices = mHeadsetProfile.getConnectedDevices(); if (devices == null) { Loading Loading @@ -366,7 +368,9 @@ public class HfpClientConnectionService extends ConnectionService { return account; } public static boolean hasHfpClientEcc(BluetoothHeadsetClient client, BluetoothDevice device) { /** Checks if device has Enhanced Call Control (ECC) feature. */ public static boolean hasHfpClientEcc(BluetoothHeadsetClientProxy client, BluetoothDevice device) { Bundle features = client.getCurrentAgEvents(device); return features != null && features.getBoolean(BluetoothHeadsetClient.EXTRA_AG_FEATURE_ECC, false); Loading android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientDeviceBlock.java +3 −3 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ package com.android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.content.Context; import android.net.Uri; import android.os.Bundle; Loading Loading @@ -48,10 +48,10 @@ public class HfpClientDeviceBlock { private final HfpClientConnectionService mConnServ; private HfpClientConference mConference; private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; HfpClientDeviceBlock(HfpClientConnectionService connServ, BluetoothDevice device, BluetoothHeadsetClient headsetProfile) { BluetoothHeadsetClientProxy headsetProfile) { mConnServ = connServ; mContext = connServ; mDevice = device; Loading Loading
android/app/src/com/android/bluetooth/hfpclient/connserv/BluetoothHeadsetClientProxy.java 0 → 100644 +102 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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 android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.os.Bundle; import java.util.List; /** * A mockable proxy class that facilitates testing of the {@code hfpclient.connserv} package. * * <p>This is necessary due to the "final" attribute of the BluetoothHeadsetClient class. */ public class BluetoothHeadsetClientProxy { private final BluetoothHeadsetClient mBluetoothHeadsetClient; public BluetoothHeadsetClientProxy(BluetoothHeadsetClient bluetoothHeadsetClient) { mBluetoothHeadsetClient = bluetoothHeadsetClient; } public BluetoothHeadsetClient getProxiedBluetoothHeadsetClient() { return mBluetoothHeadsetClient; } /** @see BluetoothHeadsetClient#dial(BluetoothDevice, String) */ public BluetoothHeadsetClientCall dial(BluetoothDevice device, String number) { return mBluetoothHeadsetClient.dial(device, number); } /** @see BluetoothHeadsetClient#enterPrivateMode(BluetoothDevice, int) */ public boolean enterPrivateMode(BluetoothDevice device, int index) { return mBluetoothHeadsetClient.enterPrivateMode(device, index); } /** @see BluetoothHeadsetClient#sendDTMF(BluetoothDevice, byte) */ public boolean sendDTMF(BluetoothDevice device, byte code) { return mBluetoothHeadsetClient.sendDTMF(device, code); } /** @see BluetoothHeadsetClient#terminateCall(BluetoothDevice, BluetoothHeadsetClientCall) */ public boolean terminateCall(BluetoothDevice device, BluetoothHeadsetClientCall call) { return mBluetoothHeadsetClient.terminateCall(device, call); } /** @see BluetoothHeadsetClient#holdCall(BluetoothDevice) */ public boolean holdCall(BluetoothDevice device) { return mBluetoothHeadsetClient.holdCall(device); } /** @see BluetoothHeadsetClient#acceptCall(BluetoothDevice, int) */ public boolean acceptCall(BluetoothDevice device, int flag) { return mBluetoothHeadsetClient.acceptCall(device, flag); } /** @see BluetoothHeadsetClient#rejectCall(BluetoothDevice) */ public boolean rejectCall(BluetoothDevice device) { return mBluetoothHeadsetClient.rejectCall(device); } /** @see BluetoothHeadsetClient#connectAudio(BluetoothDevice) */ public boolean connectAudio(BluetoothDevice device) { return mBluetoothHeadsetClient.connectAudio(device); } /** @see BluetoothHeadsetClient#disconnectAudio(BluetoothDevice) */ public boolean disconnectAudio(BluetoothDevice device) { return mBluetoothHeadsetClient.disconnectAudio(device); } /** @see BluetoothHeadsetClient#getCurrentAgEvents(BluetoothDevice) */ public Bundle getCurrentAgEvents(BluetoothDevice device) { return mBluetoothHeadsetClient.getCurrentAgEvents(device); } /** @see BluetoothHeadsetClient#getConnectedDevices() */ public List<BluetoothDevice> getConnectedDevices() { return mBluetoothHeadsetClient.getConnectedDevices(); } /** @see BluetoothHeadsetClient#getCurrentCalls(BluetoothDevice) */ public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) { return mBluetoothHeadsetClient.getCurrentCalls(device); } }
android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientConference.java +3 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.telecom.Conference; import android.telecom.Connection; import android.telecom.PhoneAccountHandle; Loading @@ -26,10 +27,10 @@ public class HfpClientConference extends Conference { private static final String TAG = "HfpClientConference"; private BluetoothDevice mDevice; private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; public HfpClientConference(PhoneAccountHandle handle, BluetoothDevice device, BluetoothHeadsetClient client) { BluetoothHeadsetClientProxy client) { super(handle); mDevice = device; mHeadsetProfile = client; Loading
android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientConnection.java +4 −3 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.content.Context; import android.net.Uri; import android.os.Bundle; Loading @@ -40,7 +41,7 @@ public class HfpClientConnection extends Connection { private final Context mContext; private final BluetoothDevice mDevice; private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; private HfpClientConnectionService mHfpClientConnectionService; private BluetoothHeadsetClientCall mCurrentCall; Loading @@ -54,7 +55,7 @@ public class HfpClientConnection extends Connection { // Constructor to be used when there's an existing call (such as that created on the AG or // when connection happens and we see calls for the first time). public HfpClientConnection(Context context, BluetoothDevice device, BluetoothHeadsetClient client, BluetoothHeadsetClientCall call) { BluetoothHeadsetClientProxy client, BluetoothHeadsetClientCall call) { mDevice = device; mContext = context; mHeadsetProfile = client; Loading @@ -72,7 +73,7 @@ public class HfpClientConnection extends Connection { // Constructor to be used when a call is intiated on the HF. The call handle is obtained by // using the dial() command. public HfpClientConnection(Context context, BluetoothDevice device, BluetoothHeadsetClient client, Uri number) { BluetoothHeadsetClientProxy client, Uri number) { mDevice = device; mContext = context; mHeadsetProfile = client; Loading
android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientConnectionService.java +8 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.bluetooth.BluetoothProfile; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; Loading Loading @@ -53,7 +54,7 @@ public class HfpClientConnectionService extends ConnectionService { private BluetoothAdapter mAdapter; // BluetoothHeadset proxy. private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; private TelecomManager mTelecomManager; private final Map<BluetoothDevice, HfpClientDeviceBlock> mDeviceBlocks = new HashMap<>(); Loading Loading @@ -145,7 +146,8 @@ public class HfpClientConnectionService extends ConnectionService { } // Close the profile. if (mHeadsetProfile != null) { mAdapter.closeProfileProxy(BluetoothProfile.HEADSET_CLIENT, mHeadsetProfile); mAdapter.closeProfileProxy(BluetoothProfile.HEADSET_CLIENT, mHeadsetProfile.getProxiedBluetoothHeadsetClient()); } // Unregister the broadcast receiver. Loading Loading @@ -286,7 +288,7 @@ public class HfpClientConnectionService extends ConnectionService { if (DBG) { Log.d(TAG, "onServiceConnected"); } mHeadsetProfile = (BluetoothHeadsetClient) proxy; mHeadsetProfile = new BluetoothHeadsetClientProxy((BluetoothHeadsetClient) proxy); List<BluetoothDevice> devices = mHeadsetProfile.getConnectedDevices(); if (devices == null) { Loading Loading @@ -366,7 +368,9 @@ public class HfpClientConnectionService extends ConnectionService { return account; } public static boolean hasHfpClientEcc(BluetoothHeadsetClient client, BluetoothDevice device) { /** Checks if device has Enhanced Call Control (ECC) feature. */ public static boolean hasHfpClientEcc(BluetoothHeadsetClientProxy client, BluetoothDevice device) { Bundle features = client.getCurrentAgEvents(device); return features != null && features.getBoolean(BluetoothHeadsetClient.EXTRA_AG_FEATURE_ECC, false); Loading
android/app/src/com/android/bluetooth/hfpclient/connserv/HfpClientDeviceBlock.java +3 −3 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ package com.android.bluetooth.hfpclient.connserv; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadsetClient; import android.bluetooth.BluetoothHeadsetClientCall; import android.bluetooth.hfpclient.connserv.BluetoothHeadsetClientProxy; import android.content.Context; import android.net.Uri; import android.os.Bundle; Loading Loading @@ -48,10 +48,10 @@ public class HfpClientDeviceBlock { private final HfpClientConnectionService mConnServ; private HfpClientConference mConference; private BluetoothHeadsetClient mHeadsetProfile; private BluetoothHeadsetClientProxy mHeadsetProfile; HfpClientDeviceBlock(HfpClientConnectionService connServ, BluetoothDevice device, BluetoothHeadsetClient headsetProfile) { BluetoothHeadsetClientProxy headsetProfile) { mConnServ = connServ; mContext = connServ; mDevice = device; Loading