Merge "Move processing off of HIDL Binder" into qt-qpr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ab45e744e6
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user