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

Commit 15ac7cfb authored by Nate Myren's avatar Nate Myren
Browse files

More intelligently deal with call ops in InCallController

Track which calls are using camera, and only start op if it isn't
already started, and stop op if all calls are finished.

Test: Manual
Fixes: 179249645
Change-Id: If91d6317fc16f1b89c01a69917a28227d192ab8c
parent 96669b2b
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -982,6 +982,11 @@ public class InCallController extends CallsManagerListenerBase {
     */
    private boolean mIsCallUsingMicrophone = false;

    /**
     * A list of call IDs which are currently using the camera.
     */
    private ArrayList<String> mCallsUsingCamera = new ArrayList<>();

    public InCallController(Context context, TelecomSystem.SyncRoot lock, CallsManager callsManager,
            SystemStateHelper systemStateHelper, DefaultDialerCache defaultDialerCache,
            Timeouts.Adapter timeoutsAdapter, EmergencyCallHelper emergencyCallHelper,
@@ -1080,6 +1085,7 @@ public class InCallController extends CallsManagerListenerBase {
        call.removeListener(mCallListener);
        mCallIdMapper.removeCall(call);
        maybeTrackMicrophoneUse(isMuted());
        onSetCamera(call, null);
    }

    @Override
@@ -1252,15 +1258,30 @@ public class InCallController extends CallsManagerListenerBase {
     */
    @Override
    public void onSetCamera(Call call, String cameraId) {
        if (call == null) {
            return;
        }

        Log.i(this, "onSetCamera callId=%s, cameraId=%s", call.getId(), cameraId);
        if (cameraId != null) {
            boolean shouldStart = mCallsUsingCamera.isEmpty();
            if (!mCallsUsingCamera.contains(call.getId())) {
                mCallsUsingCamera.add(call.getId());
            }

            if (shouldStart) {
                mAppOpsManager.startOp(AppOpsManager.OP_PHONE_CALL_CAMERA, myUid(),
                        mContext.getOpPackageName(), false, null, null);
            }
        } else {
            boolean hadCall = !mCallsUsingCamera.isEmpty();
            mCallsUsingCamera.remove(call.getId());
            if (hadCall && mCallsUsingCamera.isEmpty()) {
                mAppOpsManager.finishOp(AppOpsManager.OP_PHONE_CALL_CAMERA, myUid(),
                        mContext.getOpPackageName(), null);
            }
        }
    }

    void bringToForeground(boolean showDialpad) {
        if (!mInCallServices.isEmpty()) {