Loading core/java/android/hardware/radio/TunerCallbackAdapter.java +6 −4 Original line number Diff line number Diff line Loading @@ -211,10 +211,12 @@ class TunerCallbackAdapter extends ITunerCallback.Stub { @Override public void onProgramListUpdated(ProgramList.Chunk chunk) { mHandler.post(() -> { synchronized (mLock) { if (mProgramList == null) return; mProgramList.apply(Objects.requireNonNull(chunk)); } }); } @Override Loading services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java +35 −15 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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)); }); } }; Loading @@ -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) { Loading Loading @@ -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) { Loading Loading
core/java/android/hardware/radio/TunerCallbackAdapter.java +6 −4 Original line number Diff line number Diff line Loading @@ -211,10 +211,12 @@ class TunerCallbackAdapter extends ITunerCallback.Stub { @Override public void onProgramListUpdated(ProgramList.Chunk chunk) { mHandler.post(() -> { synchronized (mLock) { if (mProgramList == null) return; mProgramList.apply(Objects.requireNonNull(chunk)); } }); } @Override Loading
services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java +35 −15 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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)); }); } }; Loading @@ -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) { Loading Loading @@ -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) { Loading