Merge "Move processing off of HIDL Binder" into qt-qpr1-dev

This commit is contained in:
TreeHugger Robot
2019-08-21 19:17:48 +00:00
committed by Android (Google) Code Review
2 changed files with 41 additions and 19 deletions

View File

@@ -211,10 +211,12 @@ class TunerCallbackAdapter extends ITunerCallback.Stub {
@Override
public void onProgramListUpdated(ProgramList.Chunk chunk) {
synchronized (mLock) {
if (mProgramList == null) return;
mProgramList.apply(Objects.requireNonNull(chunk));
}
mHandler.post(() -> {
synchronized (mLock) {
if (mProgramList == null) return;
mProgramList.apply(Objects.requireNonNull(chunk));
}
});
}
@Override

View File

@@ -35,6 +35,8 @@ import android.hardware.broadcastradio.V2_0.Result;
import android.hardware.broadcastradio.V2_0.VendorKeyValue;
import android.hardware.radio.RadioManager;
import android.os.DeadObjectException;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.util.MutableInt;
import android.util.Slog;
@@ -44,6 +46,7 @@ import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@@ -55,6 +58,7 @@ class RadioModule {
@NonNull public final RadioManager.ModuleProperties mProperties;
private final Object mLock = new Object();
@NonNull private final Handler mHandler;
@GuardedBy("mLock")
private ITunerSession mHalTunerSession;
@@ -70,38 +74,46 @@ class RadioModule {
private final ITunerCallback mHalTunerCallback = new ITunerCallback.Stub() {
@Override
public void onTuneFailed(int result, ProgramSelector programSelector) {
fanoutAidlCallback(cb -> cb.onTuneFailed(result, Convert.programSelectorFromHal(
programSelector)));
lockAndFireLater(() -> {
android.hardware.radio.ProgramSelector csel =
Convert.programSelectorFromHal(programSelector);
fanoutAidlCallbackLocked(cb -> cb.onTuneFailed(result, csel));
});
}
@Override
public void onCurrentProgramInfoChanged(ProgramInfo halProgramInfo) {
RadioManager.ProgramInfo programInfo = Convert.programInfoFromHal(halProgramInfo);
synchronized (mLock) {
mProgramInfo = programInfo;
fanoutAidlCallbackLocked(cb -> cb.onCurrentProgramInfoChanged(programInfo));
}
lockAndFireLater(() -> {
mProgramInfo = Convert.programInfoFromHal(halProgramInfo);
fanoutAidlCallbackLocked(cb -> cb.onCurrentProgramInfoChanged(mProgramInfo));
});
}
@Override
public void onProgramListUpdated(ProgramListChunk programListChunk) {
// TODO: Cache per-AIDL client filters, send union of filters to HAL, use filters to fan
// back out to clients.
fanoutAidlCallback(cb -> cb.onProgramListUpdated(Convert.programListChunkFromHal(
programListChunk)));
lockAndFireLater(() -> {
android.hardware.radio.ProgramList.Chunk chunk =
Convert.programListChunkFromHal(programListChunk);
fanoutAidlCallbackLocked(cb -> cb.onProgramListUpdated(chunk));
});
}
@Override
public void onAntennaStateChange(boolean connected) {
synchronized (mLock) {
lockAndFireLater(() -> {
mAntennaConnected = connected;
fanoutAidlCallbackLocked(cb -> cb.onAntennaState(connected));
}
});
}
@Override
public void onParametersUpdated(ArrayList<VendorKeyValue> parameters) {
fanoutAidlCallback(cb -> cb.onParametersUpdated(Convert.vendorInfoFromHal(parameters)));
lockAndFireLater(() -> {
Map<String, String> cparam = Convert.vendorInfoFromHal(parameters);
fanoutAidlCallbackLocked(cb -> cb.onParametersUpdated(cparam));
});
}
};
@@ -113,6 +125,7 @@ class RadioModule {
@NonNull RadioManager.ModuleProperties properties) throws RemoteException {
mProperties = Objects.requireNonNull(properties);
mService = Objects.requireNonNull(service);
mHandler = new Handler(Looper.getMainLooper());
}
public static @Nullable RadioModule tryLoadingModule(int idx, @NonNull String fqName) {
@@ -201,15 +214,22 @@ class RadioModule {
}
}
// add to mHandler queue, but ensure the runnable holds mLock when it gets executed
private void lockAndFireLater(Runnable r) {
mHandler.post(() -> {
synchronized (mLock) {
r.run();
}
});
}
interface AidlCallbackRunnable {
void run(android.hardware.radio.ITunerCallback callback) throws RemoteException;
}
// Invokes runnable with each TunerSession currently open.
void fanoutAidlCallback(AidlCallbackRunnable runnable) {
synchronized (mLock) {
fanoutAidlCallbackLocked(runnable);
}
lockAndFireLater(() -> fanoutAidlCallbackLocked(runnable));
}
private void fanoutAidlCallbackLocked(AidlCallbackRunnable runnable) {