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

Commit 5c64b78f authored by SongFerng Wang's avatar SongFerng Wang Committed by Automerger Merge Worker
Browse files

Merge "The UI does not remove the preference" into udc-dev am: 28213422

parents 45c2a271 28213422
Loading
Loading
Loading
Loading
+40 −11
Original line number Diff line number Diff line
@@ -35,8 +35,10 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
@@ -266,18 +268,21 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback,
        final BluetoothDevice device = cachedDevice.getDevice();
        final CachedBluetoothDevice subCachedDevice = cachedDevice.getSubDevice();
        if (mPreferenceMap.containsKey(device)) {
            mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(device));
            mPreferenceMap.remove(device);
            removePreference(device);
        } else if (subCachedDevice != null) {
            // When doing remove, to check if preference maps to sub device.
            // This would happen when connection state is changed in detail page that there is no
            // callback from SettingsLib.
            final BluetoothDevice subDevice = subCachedDevice.getDevice();
            if (mPreferenceMap.containsKey(subDevice)) {
                mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(subDevice));
                mPreferenceMap.remove(subDevice);
            removePreference(subDevice);
        }
    }

    private void removePreference(BluetoothDevice device) {
        if (mPreferenceMap.containsKey(device)) {
            mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(device));
            mPreferenceMap.remove(device);
        }
    }

    /**
@@ -324,14 +329,38 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback,
     * Update the attributes of {@link Preference}.
     */
    public void refreshPreference() {
        for (Preference preference : mPreferenceMap.values()) {
        List<BluetoothDevice> removeList = new ArrayList<>();
        mPreferenceMap.forEach((key, preference) -> {
            if (isDeviceOfMapInCachedDevicesList(key)) {
                ((BluetoothDevicePreference) preference).onPreferenceAttributesChanged();
            } else {
                // If the BluetoothDevice of preference is not in the CachedDevices List, then
                // remove this preference.
                removeList.add(key);
            }
        });

        for (BluetoothDevice bluetoothDevice : removeList) {
            Log.d(getLogTag(), "removePreference key: " + bluetoothDevice.getAnonymizedAddress());
            removePreference(bluetoothDevice);
        }
    }

    protected boolean isDeviceInCachedDevicesList(CachedBluetoothDevice cachedDevice) {
        return mLocalManager.getCachedDeviceManager().getCachedDevicesCopy().contains(cachedDevice);
    }

    private boolean isDeviceOfMapInCachedDevicesList(BluetoothDevice inputBluetoothDevice) {
        Collection<CachedBluetoothDevice> cachedDevices =
                mLocalManager.getCachedDeviceManager().getCachedDevicesCopy();
        if (cachedDevices == null || cachedDevices.isEmpty()) {
            return false;
        }
        return cachedDevices.stream()
                .anyMatch(cachedBluetoothDevice -> cachedBluetoothDevice.getDevice() != null
                        && cachedBluetoothDevice.getDevice().equals(inputBluetoothDevice));
    }

    protected String getLogTag() {
        return TAG;
    }