FocusRequester: fix NPE

Fix NPE and potential race condition in
FocusRequester.dispatchFocusResultFromExtPolicy where mFocusDispatcher
was checked against null, but the method didn't return in that case.

Bug: 142278598
Test: Android Auto with phone call and custom focus policy
Change-Id: I88447a255132c94f8c2fbf97a1e3ee88f6d2e993
This commit is contained in:
Jean-Michel Trivi
2019-11-08 16:45:16 -08:00
parent 45216b4fdf
commit b1381b8fba

View File

@@ -437,7 +437,8 @@ public class FocusRequester {
} }
int dispatchFocusChange(int focusChange) { int dispatchFocusChange(int focusChange) {
if (mFocusDispatcher == null) { final IAudioFocusDispatcher fd = mFocusDispatcher;
if (fd == null) {
if (MediaFocusControl.DEBUG) { Log.e(TAG, "dispatchFocusChange: no focus dispatcher"); } if (MediaFocusControl.DEBUG) { Log.e(TAG, "dispatchFocusChange: no focus dispatcher"); }
return AudioManager.AUDIOFOCUS_REQUEST_FAILED; return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
} }
@@ -457,7 +458,7 @@ public class FocusRequester {
mFocusLossReceived = focusChange; mFocusLossReceived = focusChange;
} }
try { try {
mFocusDispatcher.dispatchAudioFocusChange(focusChange, mClientId); fd.dispatchAudioFocusChange(focusChange, mClientId);
} catch (android.os.RemoteException e) { } catch (android.os.RemoteException e) {
Log.e(TAG, "dispatchFocusChange: error talking to focus listener " + mClientId, e); Log.e(TAG, "dispatchFocusChange: error talking to focus listener " + mClientId, e);
return AudioManager.AUDIOFOCUS_REQUEST_FAILED; return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
@@ -466,16 +467,18 @@ public class FocusRequester {
} }
void dispatchFocusResultFromExtPolicy(int requestResult) { void dispatchFocusResultFromExtPolicy(int requestResult) {
if (mFocusDispatcher == null) { final IAudioFocusDispatcher fd = mFocusDispatcher;
if (fd == null) {
if (MediaFocusControl.DEBUG) { if (MediaFocusControl.DEBUG) {
Log.e(TAG, "dispatchFocusResultFromExtPolicy: no focus dispatcher"); Log.e(TAG, "dispatchFocusResultFromExtPolicy: no focus dispatcher");
} }
return;
} }
if (DEBUG) { if (DEBUG) {
Log.v(TAG, "dispatching result" + requestResult + " to " + mClientId); Log.v(TAG, "dispatching result" + requestResult + " to " + mClientId);
} }
try { try {
mFocusDispatcher.dispatchFocusResultFromExtPolicy(requestResult, mClientId); fd.dispatchFocusResultFromExtPolicy(requestResult, mClientId);
} catch (android.os.RemoteException e) { } catch (android.os.RemoteException e) {
Log.e(TAG, "dispatchFocusResultFromExtPolicy: error talking to focus listener" Log.e(TAG, "dispatchFocusResultFromExtPolicy: error talking to focus listener"
+ mClientId, e); + mClientId, e);