Merge "Fix for b/126739800: Enforce aggressive open policy on TunerSessions."

This commit is contained in:
George Lu
2019-03-29 23:12:30 +00:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 7 deletions

View File

@@ -24,6 +24,7 @@ import android.hardware.radio.ICloseHandle;
import android.hardware.radio.ITuner;
import android.hardware.radio.ITunerCallback;
import android.hardware.radio.RadioManager;
import android.hardware.radio.RadioTuner;
import android.hidl.manager.V1_0.IServiceManager;
import android.hidl.manager.V1_0.IServiceNotification;
import android.os.IHwBinder.DeathRecipient;
@@ -49,9 +50,17 @@ public class BroadcastRadioService {
@GuardedBy("mLock")
private final Map<String, Integer> mServiceNameToModuleIdMap = new HashMap<>();
// Map from module ID to RadioModule created by mServiceListener.onRegistration().
@GuardedBy("mLock")
private final Map<Integer, RadioModule> mModules = new HashMap<>();
// Map from module ID to TunerSession created by openSession().
//
// Because this service currently implements a 1 AIDL to 1 HAL policy, mTunerSessions is used to
// enforce the "aggresive open" policy mandated for IBroadcastRadio.openSession(). In the
// future, this solution will be replaced with a multiple-AIDL to 1 HAL implementation.
private final Map<Integer, TunerSession> mTunerSessions = new HashMap<>();
private IServiceNotification.Stub mServiceListener = new IServiceNotification.Stub() {
@Override
public void onRegistration(String fqName, String serviceName, boolean preexisting) {
@@ -72,6 +81,7 @@ public class BroadcastRadioService {
}
Slog.v(TAG, "loaded broadcast radio module " + moduleId + ": " + serviceName
+ " (HAL 2.0)");
closeTunerSessionLocked(moduleId);
mModules.put(moduleId, module);
if (newService) {
@@ -96,6 +106,7 @@ public class BroadcastRadioService {
synchronized (mLock) {
int moduleId = (int) cookie;
mModules.remove(moduleId);
closeTunerSessionLocked(moduleId);
for (Map.Entry<String, Integer> entry : mServiceNameToModuleIdMap.entrySet()) {
if (entry.getValue() == moduleId) {
@@ -152,16 +163,20 @@ public class BroadcastRadioService {
RadioModule module = null;
synchronized (mLock) {
module = mModules.get(moduleId);
}
if (module == null) {
throw new IllegalArgumentException("Invalid module ID");
if (module == null) {
throw new IllegalArgumentException("Invalid module ID");
}
closeTunerSessionLocked(moduleId);
}
TunerSession session = module.openSession(callback);
if (legacyConfig != null) {
session.setConfiguration(legacyConfig);
TunerSession tunerSession = module.openSession(callback);
synchronized (mLock) {
mTunerSessions.put(moduleId, tunerSession);
}
return session;
if (legacyConfig != null) {
tunerSession.setConfiguration(legacyConfig);
}
return tunerSession;
}
public ICloseHandle addAnnouncementListener(@NonNull int[] enabledTypes,
@@ -183,4 +198,12 @@ public class BroadcastRadioService {
}
return aggregator;
}
private void closeTunerSessionLocked(int moduleId) {
TunerSession tunerSession = mTunerSessions.remove(moduleId);
if (tunerSession != null) {
Slog.d(TAG, "Closing previous TunerSession");
tunerSession.close(RadioTuner.ERROR_HARDWARE_FAILURE);
}
}
}

View File

@@ -17,6 +17,7 @@
package com.android.server.broadcastradio.hal2;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Bitmap;
import android.hardware.broadcastradio.V2_0.ConfigFlag;
import android.hardware.broadcastradio.V2_0.ITunerSession;
@@ -58,8 +59,22 @@ class TunerSession extends ITuner.Stub {
@Override
public void close() {
close(null);
}
/**
* Closes the TunerSession. If error is non-null, the client's onError() callback is invoked
* first with the specified error, see {@link
* android.hardware.radio.RadioTuner.Callback#onError}.
*
* @param error Optional error to send to client before session is closed.
*/
public void close(@Nullable Integer error) {
synchronized (mLock) {
if (mIsClosed) return;
if (error != null) {
TunerCallback.dispatch(() -> mCallback.mClientCb.onError(error));
}
mIsClosed = true;
}
}