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

Commit 4f301b43 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Mikhail Naganov
Browse files

AudioDeviceBroker/Inventory: fix misc error-prone warnings

Make lock objects final.
Implement hashCode() for classes with equals()
Don't use StringBuilder
Fix javadoc errors
Remove unused methods isSpeakerphoneRequested
  and sendIMsg
Log errors instead of empty exception catches
Inner class can be static.
Remove unused constants.
Remove unused parameter "key" in connected devices.

Bug: 341995844
Test: m -j RUN_ERROR_PRONE=true services
Change-Id: I4ec5133fae2e184cadf651469e7fcff3db66ea1d
(cherry picked from commit 08366e4d)
Merged-In: I4ec5133fae2e184cadf651469e7fcff3db66ea1d
parent 07480177
Loading
Loading
Loading
Loading
+27 −28
Original line number Diff line number Diff line
@@ -262,7 +262,7 @@ public class AudioDeviceBroker {
     * Handle BluetoothHeadset intents where the action is one of
     *   {@link BluetoothHeadset#ACTION_ACTIVE_DEVICE_CHANGED} or
     *   {@link BluetoothHeadset#ACTION_AUDIO_STATE_CHANGED}.
     * @param intent
     * @param intent the Intent received from BT service
     */
    private void onReceiveBtEvent(@NonNull Intent intent) {
        mBtHelper.onReceiveBtEvent(intent);
@@ -283,7 +283,7 @@ public class AudioDeviceBroker {

    /**
     * Turns speakerphone on/off
     * @param on
     * @param on true to enable speakerphone
     * @param eventSource for logging purposes
     */
    /*package*/ void setSpeakerphoneOn(
@@ -297,21 +297,21 @@ public class AudioDeviceBroker {
                on, BtHelper.SCO_MODE_UNDEFINED, eventSource, isPrivileged));
    }

    private static final long SET_COMMUNICATION_DEVICE_TIMEOUT_MS = 3000;

    /** synchronization for setCommunicationDevice() and getCommunicationDevice */
    private final Object mCommunicationDeviceLock = new Object();
    @GuardedBy("mCommunicationDeviceLock")
    private int mCommunicationDeviceUpdateCount = 0;

    /**
     * Select device for use for communication use cases.
     * @param cb Client binder for death detection
     * @param uid Client uid
     * @param device Device selected or null to unselect.
     * @param eventSource for logging purposes
     * @return false if there is no device and no communication client
     */

    private static final long SET_COMMUNICATION_DEVICE_TIMEOUT_MS = 3000;

    /** synchronization for setCommunicationDevice() and getCommunicationDevice */
    private Object mCommunicationDeviceLock = new Object();
    @GuardedBy("mCommunicationDeviceLock")
    private int mCommunicationDeviceUpdateCount = 0;

    /*package*/ boolean setCommunicationDevice(IBinder cb, int uid, AudioDeviceInfo device,
                                               boolean isPrivileged, String eventSource) {

@@ -342,7 +342,6 @@ public class AudioDeviceBroker {
     * Sets or resets the communication device for matching client. If no client matches and the
     * request is to reset for a given device (deviceInfo.mOn == false), the method is a noop.
     * @param deviceInfo information on the device and requester {@link #CommunicationDeviceInfo}
     * @return true if the communication device is set or reset
     */
    @GuardedBy("mDeviceStateLock")
    /*package*/ void onSetCommunicationDeviceForClient(CommunicationDeviceInfo deviceInfo) {
@@ -728,15 +727,6 @@ public class AudioDeviceBroker {
                && mPreferredCommunicationDevice.getType() == deviceType;
    }

    /**
     * Helper method on top of isDeviceRequestedForCommunication() indicating if
     * speakerphone ON is currently requested or not.
     * @return true if speakerphone ON requested, false otherwise.
     */
    private boolean isSpeakerphoneRequested() {
        return isDeviceRequestedForCommunication(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
    }

    /**
     * Indicates if preferred route selection for communication is speakerphone.
     * @return true if speakerphone is active, false otherwise.
@@ -923,6 +913,12 @@ public class AudioDeviceBroker {
            return false;
        }

        @Override
        public int hashCode() {
            // only hashing on the fields used in equals()
            return Objects.hash(mProfile, mDevice);
        }

        @Override
        public String toString() {
            return "BtDeviceInfo: device=" + mDevice.toString()
@@ -980,7 +976,7 @@ public class AudioDeviceBroker {
    /**
     * will block on mDeviceStateLock, which is held during an A2DP (dis) connection
     * not just a simple message post
     * @param info struct with the (dis)connection information
     * @param data struct with the (dis)connection information
     */
    /*package*/ void queueOnBluetoothActiveDeviceChanged(@NonNull BtDeviceChangedData data) {
        if (data.mPreviousDevice != null
@@ -1369,6 +1365,7 @@ public class AudioDeviceBroker {
                mCommDevDispatchers.getBroadcastItem(i)
                        .dispatchCommunicationDeviceChanged(portId);
            } catch (RemoteException e) {
                Log.e(TAG, "dispatchCommunicationDevice error", e);
            }
        }
        mCommDevDispatchers.finishBroadcast();
@@ -1571,6 +1568,12 @@ public class AudioDeviceBroker {
                    && mUid == ((CommunicationDeviceInfo) o).mUid;
        }

        @Override
        public int hashCode() {
            // only hashing on the fields used in equals()
            return Objects.hash(mCb.hashCode(), mUid);
        }

        @Override
        public String toString() {
            return "CommunicationDeviceInfo mCb=" + mCb.toString()
@@ -1591,9 +1594,9 @@ public class AudioDeviceBroker {
    //@GuardedBy("mConnectedDevices")
    /*package*/ void setBluetoothA2dpOnInt(boolean on, boolean fromA2dp, String source) {
        // for logging only
        final String eventSource = new StringBuilder("setBluetoothA2dpOn(").append(on)
                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
                .append(Binder.getCallingPid()).append(" src:").append(source).toString();
        final String eventSource = "setBluetoothA2dpOn(" + on
                + ") from u/pid:" + Binder.getCallingUid() + "/"
                + Binder.getCallingPid() + " src:" + source;

        mBluetoothA2dpEnabled.set(on);
        onSetForceUse(
@@ -2192,10 +2195,6 @@ public class AudioDeviceBroker {
        sendIILMsg(msg, existingMsgPolicy, 0, 0, obj, delay);
    }

    private void sendIMsg(int msg, int existingMsgPolicy, int arg, int delay) {
        sendIILMsg(msg, existingMsgPolicy, arg, 0, null, delay);
    }

    private void sendMsgNoDelay(int msg, int existingMsgPolicy) {
        sendIILMsg(msg, existingMsgPolicy, 0, 0, null, 0);
    }
+15 −13
Original line number Diff line number Diff line
@@ -444,7 +444,7 @@ public class AudioDeviceInventory {
        @Override
        public DeviceInfo put(String key, DeviceInfo value) {
            final DeviceInfo result = super.put(key, value);
            record("put", true /* connected */, key, value);
            record("put", true /* connected */, value);
            return result;
        }

@@ -452,7 +452,7 @@ public class AudioDeviceInventory {
        public DeviceInfo putIfAbsent(String key, DeviceInfo value) {
            final DeviceInfo result = super.putIfAbsent(key, value);
            if (result == null) {
                record("putIfAbsent", true /* connected */, key, value);
                record("putIfAbsent", true /* connected */, value);
            }
            return result;
        }
@@ -461,7 +461,7 @@ public class AudioDeviceInventory {
        public DeviceInfo remove(Object key) {
            final DeviceInfo result = super.remove(key);
            if (result != null) {
                record("remove", false /* connected */, (String) key, result);
                record("remove", false /* connected */, result);
            }
            return result;
        }
@@ -470,7 +470,7 @@ public class AudioDeviceInventory {
        public boolean remove(Object key, Object value) {
            final boolean result = super.remove(key, value);
            if (result) {
                record("remove", false /* connected */, (String) key, (DeviceInfo) value);
                record("remove", false /* connected */, (DeviceInfo) value);
            }
            return result;
        }
@@ -484,7 +484,7 @@ public class AudioDeviceInventory {
        // putAll
        // replace
        // replaceAll
        private void record(String event, boolean connected, String key, DeviceInfo value) {
        private void record(String event, boolean connected, DeviceInfo value) {
            // DeviceInfo - int mDeviceType;
            // DeviceInfo - int mDeviceCodecFormat;
            new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
@@ -657,7 +657,7 @@ public class AudioDeviceInventory {
    /**
     * A class just for packaging up a set of connection parameters.
     */
    /*package*/ class WiredDeviceConnectionState {
    /*package*/ static class WiredDeviceConnectionState {
        public final AudioDeviceAttributes mAttributes;
        public final @AudioService.ConnectionState int mState;
        public final String mCaller;
@@ -1021,7 +1021,9 @@ public class AudioDeviceInventory {
                IAudioRoutesObserver obs = mRoutesObservers.getBroadcastItem(n);
                try {
                    obs.dispatchAudioRoutesChanged(routes);
                } catch (RemoteException e) { }
                } catch (RemoteException e) {
                    Log.e(TAG, "onReportNewRoutes", e);
                }
            }
        }
        mRoutesObservers.finishBroadcast();
@@ -1802,7 +1804,8 @@ public class AudioDeviceInventory {
                    .set(MediaMetrics.Property.EVENT, "disconnectHearingAid")
                    .record();
            if (toRemove.size() > 0) {
                final int delay = checkSendBecomingNoisyIntentInt(DEVICE_OUT_HEARING_AID,
                /*final int delay = */
                checkSendBecomingNoisyIntentInt(DEVICE_OUT_HEARING_AID,
                        AudioService.CONNECTION_STATE_DISCONNECTED, AudioSystem.DEVICE_NONE);
                toRemove.stream().forEach(deviceAddress ->
                        // TODO delay not used?
@@ -2664,10 +2667,6 @@ public class AudioDeviceInventory {
    private static final String CONNECT_INTENT_KEY_PORT_NAME = "portName";
    private static final String CONNECT_INTENT_KEY_STATE = "state";
    private static final String CONNECT_INTENT_KEY_ADDRESS = "address";
    private static final String CONNECT_INTENT_KEY_HAS_PLAYBACK = "hasPlayback";
    private static final String CONNECT_INTENT_KEY_HAS_CAPTURE = "hasCapture";
    private static final String CONNECT_INTENT_KEY_HAS_MIDI = "hasMIDI";
    private static final String CONNECT_INTENT_KEY_DEVICE_CLASS = "class";

    private void sendDeviceConnectionIntent(int device, int state, String address,
                                            String deviceName) {
@@ -2830,6 +2829,7 @@ public class AudioDeviceInventory {
                mPrefDevDispatchers.getBroadcastItem(i).dispatchPrefDevicesChanged(
                        strategy, devices);
            } catch (RemoteException e) {
                Log.e(TAG, "dispatchPreferredDevice ", e);
            }
        }
        mPrefDevDispatchers.finishBroadcast();
@@ -2846,6 +2846,7 @@ public class AudioDeviceInventory {
                mNonDefDevDispatchers.getBroadcastItem(i).dispatchNonDefDevicesChanged(
                        strategy, devices);
            } catch (RemoteException e) {
                Log.e(TAG, "dispatchNonDefaultDevice ", e);
            }
        }
        mNonDefDevDispatchers.finishBroadcast();
@@ -2862,6 +2863,7 @@ public class AudioDeviceInventory {
                mDevRoleCapturePresetDispatchers.getBroadcastItem(i).dispatchDevicesRoleChanged(
                        capturePreset, role, devices);
            } catch (RemoteException e) {
                Log.e(TAG, "dispatchDevicesRoleForCapturePreset ", e);
            }
        }
        mDevRoleCapturePresetDispatchers.finishBroadcast();
@@ -2927,7 +2929,7 @@ public class AudioDeviceInventory {

    /**
     * Check if device is in the list of connected devices
     * @param device
     * @param device the device to query
     * @return true if connected
     */
    @VisibleForTesting