Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3bbb709 authored by Jason Hsu's avatar Jason Hsu Committed by Android (Google) Code Review
Browse files

Merge changes from topic "hearingAidsInT" into tm-dev

* changes:
  Add 'Live Caption' preference for hearing aids device in Device details page
  Update summary in Accessibility -> Hearing aids
  Header for hearing aids now listed in one summary
parents 36693d80 384200a3
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -66,6 +66,18 @@
    <PreferenceCategory
        android:key="bluetooth_profiles"/>

    <PreferenceCategory
        android:key="bluetooth_related_tools"
        android:title="@string/bluetooth_screen_related">
        <Preference
            android:key="live_caption"
            android:icon="@drawable/ic_live_caption"
            android:persistent="false"
            android:summary="@string/live_caption_summary"
            android:title="@string/live_caption_title"
            settings:controller="com.android.settings.accessibility.LiveCaptionPreferenceController"/>
    </PreferenceCategory>

    <com.android.settingslib.widget.FooterPreference
        android:key="device_details_footer"
        android:selectable="false"
+57 −31
Original line number Diff line number Diff line
@@ -39,12 +39,13 @@ import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
@@ -82,15 +83,13 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC

    private final LocalBluetoothManager mLocalBluetoothManager;
    private final BluetoothAdapter mBluetoothAdapter;
    //cache value of supporting hearing aid or not
    private boolean mHearingAidProfileSupported;

    private FragmentManager mFragmentManager;

    public AccessibilityHearingAidPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mLocalBluetoothManager = getLocalBluetoothManager();
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mHearingAidProfileSupported = isHearingAidProfileSupported();
    }

    @Override
@@ -101,25 +100,21 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC

    @Override
    public int getAvailabilityStatus() {
        return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
        return isHearingAidProfileSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public void onStart() {
        if (mHearingAidProfileSupported) {
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
        mContext.registerReceiver(mHearingAidChangedReceiver, filter);
    }
    }

    @Override
    public void onStop() {
        if (mHearingAidProfileSupported) {
        mContext.unregisterReceiver(mHearingAidChangedReceiver);
    }
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
@@ -141,7 +136,27 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC
        if (device == null) {
            return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary);
        }
        return device.getName();

        final int connectedNum = getConnectedHearingAidDeviceNum();
        final CharSequence name = device.getName();
        final int side = device.getDeviceSide();
        final CachedBluetoothDevice subDevice = device.getSubDevice();
        if (connectedNum > 1) {
            return mContext.getString(R.string.accessibility_hearingaid_more_device_summary, name);
        }
        if (subDevice != null && subDevice.isConnected()) {
            return mContext.getString(
                    R.string.accessibility_hearingaid_left_and_right_side_device_summary, name);
        }
        if (side == HearingAidProfile.DeviceSide.SIDE_INVALID) {
            return mContext.getString(
                    R.string.accessibility_hearingaid_active_device_summary, name);
        }
        return (side == HearingAidProfile.DeviceSide.SIDE_LEFT)
                ? mContext.getString(
                        R.string.accessibility_hearingaid_left_side_device_summary, name)
                : mContext.getString(
                        R.string.accessibility_hearingaid_right_side_device_summary, name);
    }

    public void setFragmentManager(FragmentManager fragmentManager) {
@@ -150,33 +165,44 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC

    @VisibleForTesting
    CachedBluetoothDevice getConnectedHearingAidDevice() {
        if (!mHearingAidProfileSupported) {
            return null;
        }
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
        if (!isHearingAidProfileSupported()) {
            return null;
        }
        final List<BluetoothDevice> deviceList = mLocalBluetoothManager.getProfileManager()
                .getHearingAidProfile().getConnectedDevices();
        final Iterator it = deviceList.iterator();
        while (it.hasNext()) {
            BluetoothDevice obj = (BluetoothDevice)it.next();
            if (!mLocalBluetoothManager.getCachedDeviceManager().isSubDevice(obj)) {
                return mLocalBluetoothManager.getCachedDeviceManager().findDevice(obj);

        final CachedBluetoothDeviceManager deviceManager =
                mLocalBluetoothManager.getCachedDeviceManager();
        final HearingAidProfile hearingAidProfile =
                mLocalBluetoothManager.getProfileManager().getHearingAidProfile();
        final List<BluetoothDevice> deviceList = hearingAidProfile.getConnectedDevices();
        for (BluetoothDevice obj : deviceList) {
            if (!deviceManager.isSubDevice(obj)) {
                return deviceManager.findDevice(obj);
            }
        }
        return null;
    }

    private int getConnectedHearingAidDeviceNum() {
        if (!isHearingAidProfileSupported()) {
            return 0;
        }

        final CachedBluetoothDeviceManager deviceManager =
                mLocalBluetoothManager.getCachedDeviceManager();
        final HearingAidProfile hearingAidProfile =
                mLocalBluetoothManager.getProfileManager().getHearingAidProfile();
        final List<BluetoothDevice> deviceList = hearingAidProfile.getConnectedDevices();
        return (int) deviceList.stream()
                .filter(device -> !deviceManager.isSubDevice(device))
                .count();
    }

    private boolean isHearingAidProfileSupported() {
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
            return false;
        }
        final List<Integer> supportedList = mBluetoothAdapter.getSupportedProfiles();
        if (supportedList.contains(BluetoothProfile.HEARING_AID)) {
            return true;
        }
        return false;
        return supportedList.contains(BluetoothProfile.HEARING_AID);
    }

    private LocalBluetoothManager getLocalBluetoothManager() {
+1 −3
Original line number Diff line number Diff line
@@ -75,10 +75,8 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
        if (TextUtils.isEmpty(summaryText)) {
            // If first summary is unavailable, not to show second summary.
            mHeaderController.setSecondSummary((CharSequence)null);
        } else {
            // If both the hearing aids are connected, two device status should be shown.
            mHeaderController.setSecondSummary(mDeviceManager.getSubDeviceSummary(mCachedDevice));
        }

        mHeaderController.setLabel(mCachedDevice.getName());
        mHeaderController.setIcon(pair.first);
        mHeaderController.setIconContentDescription(pair.second);
+72 −0
Original line number Diff line number Diff line
/*
 * 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.content.Context;

import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;

import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.core.lifecycle.Lifecycle;

/**
 * This class adds related tools preference.
 */
public class BluetoothDetailsRelatedToolsController extends BluetoothDetailsController{
    private static final String KEY_RELATED_TOOLS_GROUP = "bluetooth_related_tools";
    private static final String KEY_LIVE_CAPTION = "live_caption";

    public BluetoothDetailsRelatedToolsController(Context context,
            PreferenceFragmentCompat fragment, CachedBluetoothDevice device, Lifecycle lifecycle) {
        super(context, fragment, device, lifecycle);
        lifecycle.addObserver(this);
    }

    @Override
    public boolean isAvailable() {
        return mCachedDevice.isHearingAidDevice();
    }

    @Override
    protected void init(PreferenceScreen screen) {
        if (!mCachedDevice.isHearingAidDevice()) {
            return;
        }

        final PreferenceCategory preferenceCategory = screen.findPreference(getPreferenceKey());
        final Preference liveCaptionPreference = screen.findPreference(KEY_LIVE_CAPTION);
        if (!liveCaptionPreference.isVisible()) {
            preferenceCategory.removePreference(liveCaptionPreference);
        }

        if (preferenceCategory.getPreferenceCount() == 0) {
            screen.removePreference(preferenceCategory);
        }
    }

    @Override
    protected void refresh() {}

    @Override
    public String getPreferenceKey() {
        return KEY_RELATED_TOOLS_GROUP;
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -246,6 +246,8 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
                    mCachedDevice, lifecycle));
            controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
                    lifecycle));
            controllers.add(new BluetoothDetailsRelatedToolsController(context, this, mCachedDevice,
                    lifecycle));
        }
        return controllers;
    }
Loading