Hearing aid constants defined differently across different hearing aid related profiles. For hearing aid device mode, HearingAidProfile and HapClientProfile have different values for mode definition and there is also a new BANDED hearing aid type in HapClientProfile spec. For hearing aid device side, HearingAidProfile has only 2 kinds of side which is left and right whereas BLE hearing aid can retrieve 27 different kinds of audio location. We therefore introduce a new class HearingAidInfo for mapping these different constants across these profiles into a single unified set of constants. Bug: 253192350 Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilityHearingAidPreferenceControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=HearingAidPairingDialogFragmentTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=HearingAidUtilsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothDetailsPairOtherControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=AvailableMediaDeviceGroupControllerTest Change-Id: Id14928dbc051fcf76fe0d66b43aefefb1b5f7baf
128 lines
4.9 KiB
Java
128 lines
4.9 KiB
Java
/*
|
|
* Copyright (C) 2022 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 com.android.settings.bluetooth;
|
|
|
|
import android.app.Dialog;
|
|
import android.app.settings.SettingsEnums;
|
|
import android.bluetooth.BluetoothAdapter;
|
|
import android.bluetooth.BluetoothDevice;
|
|
import android.content.Context;
|
|
import android.os.Bundle;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.appcompat.app.AlertDialog;
|
|
|
|
import com.android.settings.R;
|
|
import com.android.settings.core.SubSettingLauncher;
|
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
|
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
|
import com.android.settingslib.bluetooth.HearingAidInfo;
|
|
import com.android.settingslib.bluetooth.LocalBluetoothManager;
|
|
|
|
/**
|
|
* Provides a dialog to pair another side of hearing aid device.
|
|
*/
|
|
public class HearingAidPairingDialogFragment extends InstrumentedDialogFragment implements
|
|
CachedBluetoothDevice.Callback {
|
|
public static final String TAG = "HearingAidPairingDialogFragment";
|
|
private static final String KEY_DEVICE_ADDRESS = "device_address";
|
|
private LocalBluetoothManager mLocalBluetoothManager;
|
|
private CachedBluetoothDevice mDevice;
|
|
|
|
/**
|
|
* Creates a new {@link HearingAidPairingDialogFragment} and shows pair another side of hearing
|
|
* aid device according to {@code deviceAddress}.
|
|
*
|
|
* @param deviceAddress The remote Bluetooth device address, that needs to be a hearing aid
|
|
* device.
|
|
* @return a DialogFragment
|
|
*/
|
|
public static HearingAidPairingDialogFragment newInstance(String deviceAddress) {
|
|
Bundle args = new Bundle(1);
|
|
args.putString(KEY_DEVICE_ADDRESS, deviceAddress);
|
|
final HearingAidPairingDialogFragment fragment = new HearingAidPairingDialogFragment();
|
|
fragment.setArguments(args);
|
|
return fragment;
|
|
}
|
|
|
|
@Override
|
|
public void onAttach(Context context) {
|
|
super.onAttach(context);
|
|
mLocalBluetoothManager = Utils.getLocalBtManager(context);
|
|
mDevice = getDevice();
|
|
if (mDevice != null) {
|
|
mDevice.registerCallback(this);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onDetach() {
|
|
super.onDetach();
|
|
if (mDevice != null) {
|
|
mDevice.unregisterCallback(this);
|
|
}
|
|
}
|
|
|
|
private CachedBluetoothDevice getDevice() {
|
|
final String deviceAddress = getArguments().getString(KEY_DEVICE_ADDRESS);
|
|
final BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
|
|
deviceAddress);
|
|
return mLocalBluetoothManager.getCachedDeviceManager().findDevice(device);
|
|
}
|
|
|
|
@Override
|
|
public int getMetricsCategory() {
|
|
return SettingsEnums.DIALOG_ACCESSIBILITY_HEARING_AID_PAIR_ANOTHER;
|
|
}
|
|
|
|
@NonNull
|
|
@Override
|
|
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
|
final int deviceSide = mDevice.getDeviceSide();
|
|
final int titleId = R.string.bluetooth_pair_other_ear_dialog_title;
|
|
final int messageId = (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT)
|
|
? R.string.bluetooth_pair_other_ear_dialog_left_ear_message
|
|
: R.string.bluetooth_pair_other_ear_dialog_right_ear_message;
|
|
final int pairBtnId = (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT)
|
|
? R.string.bluetooth_pair_other_ear_dialog_right_ear_positive_button
|
|
: R.string.bluetooth_pair_other_ear_dialog_left_ear_positive_button;
|
|
|
|
return new AlertDialog.Builder(getActivity())
|
|
.setTitle(titleId)
|
|
.setMessage(messageId)
|
|
.setNegativeButton(android.R.string.cancel, /* listener= */ null)
|
|
.setPositiveButton(pairBtnId, (dialog, which) -> positiveButtonListener())
|
|
.create();
|
|
}
|
|
|
|
private void positiveButtonListener() {
|
|
new SubSettingLauncher(getActivity())
|
|
.setDestination(BluetoothPairingDetail.class.getName())
|
|
.setSourceMetricsCategory(getMetricsCategory())
|
|
.launch();
|
|
}
|
|
|
|
@Override
|
|
public void onDeviceAttributesChanged() {
|
|
final CachedBluetoothDevice subDevice = mDevice.getSubDevice();
|
|
if (subDevice != null && subDevice.isConnectedAshaHearingAidDevice()) {
|
|
this.dismiss();
|
|
}
|
|
}
|
|
}
|