From 9da407a965d2111b98f7f3ec01ea187784020951 Mon Sep 17 00:00:00 2001 From: Saba Sarabta Date: Mon, 25 Dec 2023 12:33:14 +0200 Subject: Floss: Implement Pandora HFP profile (part2). Bug: 301000117 Bug: 301000133 Bug: 300942860 Bug: 301000134 Bug: 301000127 Bug: 301000129 Bug: 300954039 Bug: 301000131 Bug: 300954045 Bug: 301036158 Bug: 301036160 Test: mma packages/modules/Bluetooth && pts-bot HFP Tag: #floss Flag: EXEMPT floss only changes Change-Id: I648da8963227c38f4725991053a062c7ed61d9bf --- floss/pandora/server/bluetooth.py | 6 ++++ floss/pandora/server/hfp.py | 73 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) (limited to 'floss') diff --git a/floss/pandora/server/bluetooth.py b/floss/pandora/server/bluetooth.py index 1ef1496506..41254a9ada 100644 --- a/floss/pandora/server/bluetooth.py +++ b/floss/pandora/server/bluetooth.py @@ -392,6 +392,12 @@ class Bluetooth(object): def audio_disconnect(self, address): return self.telephony_client.audio_disconnect(address) + def hangup_call(self): + return self.telephony_client.hangup_call() + + def set_battery_level(self, battery_level): + return self.telephony_client.set_battery_level(battery_level) + def gatt_connect(self, address, is_direct, transport): return self.gatt_client.connect_client(address, is_direct, transport) diff --git a/floss/pandora/server/hfp.py b/floss/pandora/server/hfp.py index d31439c6d3..59f2e81318 100644 --- a/floss/pandora/server/hfp.py +++ b/floss/pandora/server/hfp.py @@ -13,7 +13,11 @@ # limitations under the License. """HFP grpc interface.""" +import math + +from floss.pandora.floss import utils from floss.pandora.server import bluetooth as bluetooth_module +from google.protobuf import empty_pb2 import grpc from pandora_experimental import hfp_grpc_aio from pandora_experimental import hfp_pb2 @@ -35,6 +39,75 @@ class HFPService(hfp_grpc_aio.HFPServicer): self.bluetooth.set_phone_ops_enabled(True) self.bluetooth.set_mps_qualification_enabled(True) + async def EnableSlc(self, request: hfp_pb2.EnableSlcRequest, context: grpc.ServicerContext) -> empty_pb2.Empty: + self.enable_phone_for_testing() + address = utils.connection_from(request.connection).address + self.bluetooth.connect_device(address) + return empty_pb2.Empty() + + async def EnableSlcAsHandsfree(self, request: hfp_pb2.EnableSlcAsHandsfreeRequest, + context: grpc.ServicerContext) -> empty_pb2.Empty: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + + async def DisableSlc(self, request: hfp_pb2.DisableSlcRequest, context: grpc.ServicerContext) -> empty_pb2.Empty: + address = utils.connection_from(request.connection).address + self.bluetooth.disconnect_device(address) + return empty_pb2.Empty() + + async def DisableSlcAsHandsfree(self, request: hfp_pb2.DisableSlcAsHandsfreeRequest, + context: grpc.ServicerContext) -> empty_pb2.Empty: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + + async def DeclineCall(self, request: hfp_pb2.DeclineCallRequest, + context: grpc.ServicerContext) -> hfp_pb2.DeclineCallResponse: + self.enable_phone_for_testing() + self.bluetooth.hangup_call() + return hfp_pb2.DeclineCallResponse() + + async def DeclineCallAsHandsfree(self, request: hfp_pb2.DeclineCallAsHandsfreeRequest, + context: grpc.ServicerContext) -> hfp_pb2.DeclineCallAsHandsfreeResponse: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + + async def SetBatteryLevel(self, request: hfp_pb2.SetBatteryLevelRequest, + context: grpc.ServicerContext) -> (empty_pb2.Empty): + self.enable_phone_for_testing() + if request.battery_percentage > 100 or request.battery_percentage < 0: + await context.abort(grpc.StatusCode.INVALID_ARGUMENT, 'Wrong battery percentage.') + self.bluetooth.set_battery_level(math.floor((request.battery_percentage / 100) * 5)) + return empty_pb2.Empty() + + async def ConnectToAudioAsHandsfree(self, request: hfp_pb2.ConnectToAudioAsHandsfreeRequest, + context: grpc.ServicerContext) -> hfp_pb2.ConnectToAudioAsHandsfreeResponse: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + + async def DisconnectFromAudioAsHandsfree( + self, request: hfp_pb2.DisconnectFromAudioAsHandsfreeRequest, + context: grpc.ServicerContext) -> hfp_pb2.DisconnectFromAudioAsHandsfreeResponse: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + + async def SetVoiceRecognition(self, request: hfp_pb2.SetVoiceRecognitionRequest, + context: grpc.ServicerContext) -> hfp_pb2.SetVoiceRecognitionResponse: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + + async def SetVoiceRecognitionAsHandsfree( + self, request: hfp_pb2.SetVoiceRecognitionAsHandsfreeRequest, + context: grpc.ServicerContext) -> hfp_pb2.SetVoiceRecognitionAsHandsfreeResponse: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + context.set_details("Method not implemented!") # type: ignore + raise NotImplementedError("Method not implemented!") + async def MakeCall(self, request: hfp_pb2.MakeCallRequest, context: grpc.ServicerContext) -> hfp_pb2.MakeCallResponse: self.enable_phone_for_testing() -- cgit v1.2.3-59-g8ed1b