Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83f99638 authored by Tomasz Wasilczyk's avatar Tomasz Wasilczyk Committed by android-build-merger
Browse files

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

am: ab45e744

Change-Id: Id4e5a11a608d797689af90be53f0f0571615333d
parents 86e816d5 ab45e744
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -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
+35 −15
Original line number Diff line number Diff line
@@ -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) {