Fix null pointer exception if USBPort is removed
If for some reason a USB port instance is removed, UsbPortManager handles this by broadcasting a UsbManager.ACTION_USB_PORT_CHANGED intent with null as the UsbPortStatus argument, leading to a null pointer exception after UsbDeviceManager receives it. Take care of this by checking for null in UsbHandler.updateHostState(). Bug: 156230008 Change-Id: Ia8936358c61af5b537d1eb722a55851e0061b381
This commit is contained in:
@@ -832,20 +832,31 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
|
||||
boolean prevHostConnected = mHostConnected;
|
||||
UsbPort port = (UsbPort) args.arg1;
|
||||
UsbPortStatus status = (UsbPortStatus) args.arg2;
|
||||
mHostConnected = status.getCurrentDataRole() == DATA_ROLE_HOST;
|
||||
mSourcePower = status.getCurrentPowerRole() == POWER_ROLE_SOURCE;
|
||||
mSinkPower = status.getCurrentPowerRole() == POWER_ROLE_SINK;
|
||||
mAudioAccessoryConnected = (status.getCurrentMode() == MODE_AUDIO_ACCESSORY);
|
||||
|
||||
if (status != null) {
|
||||
mHostConnected = status.getCurrentDataRole() == DATA_ROLE_HOST;
|
||||
mSourcePower = status.getCurrentPowerRole() == POWER_ROLE_SOURCE;
|
||||
mSinkPower = status.getCurrentPowerRole() == POWER_ROLE_SINK;
|
||||
mAudioAccessoryConnected = (status.getCurrentMode() == MODE_AUDIO_ACCESSORY);
|
||||
|
||||
// Ideally we want to see if PR_SWAP and DR_SWAP is supported.
|
||||
// But, this should be suffice, since, all four combinations are only supported
|
||||
// when PR_SWAP and DR_SWAP are supported.
|
||||
mSupportsAllCombinations = status.isRoleCombinationSupported(
|
||||
POWER_ROLE_SOURCE, DATA_ROLE_HOST)
|
||||
&& status.isRoleCombinationSupported(POWER_ROLE_SINK, DATA_ROLE_HOST)
|
||||
&& status.isRoleCombinationSupported(POWER_ROLE_SOURCE,
|
||||
DATA_ROLE_DEVICE)
|
||||
&& status.isRoleCombinationSupported(POWER_ROLE_SINK, DATA_ROLE_DEVICE);
|
||||
} else {
|
||||
mHostConnected = false;
|
||||
mSourcePower = false;
|
||||
mSinkPower = false;
|
||||
mAudioAccessoryConnected = false;
|
||||
mSupportsAllCombinations = false;
|
||||
}
|
||||
|
||||
mAudioAccessorySupported = port.isModeSupported(MODE_AUDIO_ACCESSORY);
|
||||
// Ideally we want to see if PR_SWAP and DR_SWAP is supported.
|
||||
// But, this should be suffice, since, all four combinations are only supported
|
||||
// when PR_SWAP and DR_SWAP are supported.
|
||||
mSupportsAllCombinations = status.isRoleCombinationSupported(
|
||||
POWER_ROLE_SOURCE, DATA_ROLE_HOST)
|
||||
&& status.isRoleCombinationSupported(POWER_ROLE_SINK, DATA_ROLE_HOST)
|
||||
&& status.isRoleCombinationSupported(POWER_ROLE_SOURCE,
|
||||
DATA_ROLE_DEVICE)
|
||||
&& status.isRoleCombinationSupported(POWER_ROLE_SINK, DATA_ROLE_DEVICE);
|
||||
|
||||
args.recycle();
|
||||
updateUsbNotification(false);
|
||||
|
||||
Reference in New Issue
Block a user