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

Commit b686aa5f authored by Aravind Angadi's avatar Aravind Angadi Committed by Marvin Ramin
Browse files

CEC: Move finishWithCallback method to FeatureAction

Bug: 159901363
Test: None
Merged-In: Idd30ec162136c8b32e8cee1181c6e3e733aa9966
Change-Id: Idd30ec162136c8b32e8cee1181c6e3e733aa9966
parent a954e2dc
Loading
Loading
Loading
Loading
+5 −28
Original line number Diff line number Diff line
@@ -22,11 +22,8 @@ import android.hardware.hdmi.HdmiPlaybackClient;
import android.hardware.hdmi.HdmiPlaybackClient.DisplayStatusCallback;
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.RemoteException;
import android.util.Slog;

import java.util.ArrayList;
import java.util.List;

/**
 * Feature action that queries the power status of other device. This action is initiated via
@@ -42,7 +39,6 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction {
    private static final int STATE_WAITING_FOR_REPORT_POWER_STATUS = 1;

    private final int mTargetAddress;
    private final List<IHdmiControlCallback> mCallbacks = new ArrayList<>();

    // Retry the power status query as it might happen when the target device is waking up. In
    // that case a device may be quite busy and can fail to respond within the 2s timeout.
@@ -59,9 +55,8 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction {

    private DevicePowerStatusAction(HdmiCecLocalDevice localDevice,
            int targetAddress, IHdmiControlCallback callback) {
        super(localDevice);
        super(localDevice, callback);
        mTargetAddress = targetAddress;
        addCallback(callback);
    }

    @Override
@@ -74,8 +69,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction {
                    && deviceInfo.getCecVersion() >= HdmiControlManager.HDMI_CEC_VERSION_2_0) {
                int powerStatus = deviceInfo.getDevicePowerStatus();
                if (powerStatus != HdmiControlManager.POWER_STATUS_UNKNOWN) {
                    invokeCallback(powerStatus);
                    finish();
                    finishWithCallback(powerStatus);
                    return true;
                }
            }
@@ -93,8 +87,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction {
                // the device is not present or not capable of CEC.
                if (error == SendMessageResult.NACK) {
                    // Got no response from TV. Report status 'unknown'.
                    invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
                    finish();
                    finishWithCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
                }
            });
    }
@@ -107,8 +100,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction {
        }
        if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) {
            int status = cmd.getParams()[0];
            invokeCallback(status);
            finish();
            finishWithCallback(status);
            return true;
        }
        return false;
@@ -127,22 +119,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction {
            }

            // Got no response from TV. Report status 'unknown'.
            invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
            finish();
        }
    }

    public void addCallback(IHdmiControlCallback callback) {
        mCallbacks.add(callback);
    }

    private void invokeCallback(int result) {
        try {
            for (IHdmiControlCallback callback : mCallbacks) {
                callback.onComplete(result);
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Callback failed:" + e);
            finishWithCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
        }
    }
}
+15 −26
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.HdmiTvClient;
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.RemoteException;
import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
@@ -63,7 +62,6 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
    static final int STATE_WAIT_FOR_DEVICE_POWER_ON = 3;

    private final HdmiDeviceInfo mTarget;
    private final IHdmiControlCallback mCallback;
    private final HdmiCecMessage mGivePowerStatus;
    private final boolean mIsCec20;

@@ -86,8 +84,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
    @VisibleForTesting
    DeviceSelectAction(HdmiCecLocalDeviceTv source, HdmiDeviceInfo target,
                       IHdmiControlCallback callback, boolean isCec20) {
        super(source);
        mCallback = callback;
        super(source, callback);
        mTarget = target;
        mGivePowerStatus = HdmiCecMessageBuilder.buildGiveDevicePowerStatus(
                getSourceAddress(), getTargetAddress());
@@ -108,7 +105,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
        if (!mIsCec20 || targetPowerStatus == HdmiControlManager.POWER_STATUS_UNKNOWN) {
            queryDevicePowerStatus();
        } else if (targetPowerStatus == HdmiControlManager.POWER_STATUS_ON) {
            invokeCallbackAndFinish(HdmiControlManager.RESULT_SUCCESS);
            finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
            return true;
        }
        mState = STATE_WAIT_FOR_REPORT_POWER_STATUS;
@@ -117,11 +114,14 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
    }

    private void queryDevicePowerStatus() {
        sendCommand(mGivePowerStatus, new SendMessageCallback() {
        sendCommand(
                mGivePowerStatus,
                new SendMessageCallback() {
                    @Override
                    public void onSendCompleted(int error) {
                        if (error != SendMessageResult.SUCCESS) {
                    invokeCallbackAndFinish(HdmiControlManager.RESULT_COMMUNICATION_FAILED);
                            finishWithCallback(HdmiControlManager.RESULT_COMMUNICATION_FAILED);
                            return;
                        }
                    }
                });
@@ -189,7 +189,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
        switch (mState) {
            case STATE_WAIT_FOR_REPORT_POWER_STATUS:
                if (tv().isPowerStandbyOrTransient()) {
                    invokeCallbackAndFinish(HdmiControlManager.RESULT_INCORRECT_MODE);
                    finishWithCallback(HdmiControlManager.RESULT_INCORRECT_MODE);
                    return;
                }
                selectDevice();
@@ -217,7 +217,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
        if (!mIsCec20) {
            sendSetStreamPath();
        }
        invokeCallbackAndFinish(HdmiControlManager.RESULT_SUCCESS);
        finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
    }

    private void sendSetStreamPath() {
@@ -228,15 +228,4 @@ final class DeviceSelectAction extends HdmiCecFeatureAction {
        sendCommand(HdmiCecMessageBuilder.buildSetStreamPath(
                getSourceAddress(), mTarget.getPhysicalAddress()));
    }

    private void invokeCallbackAndFinish(int result) {
        if (mCallback != null) {
            try {
                mCallback.onComplete(result);
            } catch (RemoteException e) {
                Slog.e(TAG, "Callback failed:" + e);
            }
        }
        finish();
    }
}
+38 −0
Original line number Diff line number Diff line
@@ -15,9 +15,11 @@
 */
package com.android.server.hdmi;

import android.hardware.hdmi.IHdmiControlCallback;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.Pair;
import android.util.Slog;

@@ -25,6 +27,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.hdmi.HdmiControlService.DevicePollingCallback;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
@@ -61,7 +64,20 @@ abstract class HdmiCecFeatureAction {

    private ArrayList<Pair<HdmiCecFeatureAction, Runnable>> mOnFinishedCallbacks;

    final List<IHdmiControlCallback> mCallbacks = new ArrayList<>();

    HdmiCecFeatureAction(HdmiCecLocalDevice source) {
        this(source, new ArrayList<>());
    }

    HdmiCecFeatureAction(HdmiCecLocalDevice source, IHdmiControlCallback callback) {
        this(source, Arrays.asList(callback));
    }

    HdmiCecFeatureAction(HdmiCecLocalDevice source, List<IHdmiControlCallback> callbacks) {
        for (IHdmiControlCallback callback : callbacks) {
            addCallback(callback);
        }
        mSource = source;
        mService = mSource.getService();
        mActionTimer = createActionTimer(mService.getServiceLooper());
@@ -282,4 +298,26 @@ abstract class HdmiCecFeatureAction {
        }
        mOnFinishedCallbacks.add(Pair.create(action, runnable));
    }

    protected void finishWithCallback(int returnCode) {
        invokeCallback(returnCode);
        finish();
    }

    public void addCallback(IHdmiControlCallback callback) {
        mCallbacks.add(callback);
    }

    private void invokeCallback(int result) {
        try {
            for (IHdmiControlCallback callback : mCallbacks) {
                if (callback == null) {
                    continue;
                }
                callback.onComplete(result);
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Callback failed:" + e);
        }
    }
}
+4 −24
Original line number Diff line number Diff line
@@ -18,11 +18,8 @@ package com.android.server.hdmi;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
import android.hardware.hdmi.IHdmiControlCallback;
import android.os.RemoteException;
import android.util.Slog;

import java.util.ArrayList;
import java.util.List;

/**
 * Feature action that performs one touch play against TV/Display device. This action is initiated
@@ -50,7 +47,6 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
    private static final int LOOP_COUNTER_MAX = 10;

    private final int mTargetAddress;
    private final List<IHdmiControlCallback> mCallbacks = new ArrayList<>();

    private int mPowerStatusCounter = 0;

@@ -69,9 +65,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {

    private OneTouchPlayAction(HdmiCecLocalDevice localDevice, int targetAddress,
            IHdmiControlCallback callback) {
        super(localDevice);
        super(localDevice, callback);
        mTargetAddress = targetAddress;
        addCallback(callback);
    }

    @Override
@@ -121,8 +116,7 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
            int status = cmd.getParams()[0];
            if (status == HdmiControlManager.POWER_STATUS_ON) {
                broadcastActiveSource();
                invokeCallback(HdmiControlManager.RESULT_SUCCESS);
                finish();
                finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
            }
            return true;
        }
@@ -140,26 +134,11 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
                addTimer(mState, HdmiConfig.TIMEOUT_MS);
            } else {
                // Couldn't wake up the TV for whatever reason. Report failure.
                invokeCallback(HdmiControlManager.RESULT_TIMEOUT);
                finish();
                finishWithCallback(HdmiControlManager.RESULT_TIMEOUT);
            }
        }
    }

    public void addCallback(IHdmiControlCallback callback) {
        mCallbacks.add(callback);
    }

    private void invokeCallback(int result) {
        try {
            for (IHdmiControlCallback callback : mCallbacks) {
                callback.onComplete(result);
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Callback failed:" + e);
        }
    }

    private boolean shouldTurnOnConnectedAudioSystem() {
        HdmiControlService service = mSource.mService;
        if (service.isAudioSystemDevice()) {
@@ -170,4 +149,5 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
                        HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE);
        return sendStandbyOnSleep.equals(HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
    }

}
+1 −22
Original line number Diff line number Diff line
@@ -16,11 +16,9 @@

package com.android.server.hdmi;

import android.annotation.Nullable;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.IHdmiControlCallback;
import android.os.RemoteException;
import android.util.Slog;

import com.android.server.hdmi.HdmiControlService.SendMessageCallback;
@@ -66,15 +64,12 @@ final class RoutingControlAction extends HdmiCecFeatureAction {
    // <Inactive Source> command.
    private final boolean mNotifyInputChange;

    @Nullable private final IHdmiControlCallback mCallback;

    // The latest routing path. Updated by each <Routing Information> from CEC switches.
    private int mCurrentRoutingPath;

    RoutingControlAction(HdmiCecLocalDevice localDevice, int path, boolean queryDevicePowerStatus,
            IHdmiControlCallback callback) {
        super(localDevice);
        mCallback = callback;
        super(localDevice, callback);
        mCurrentRoutingPath = path;
        mQueryDevicePowerStatus = queryDevicePowerStatus;
        // Callback is non-null when routing control action is brought up by binder API. Use
@@ -147,11 +142,6 @@ final class RoutingControlAction extends HdmiCecFeatureAction {
                mCurrentRoutingPath));
    }

    private void finishWithCallback(int result) {
        invokeCallback(result);
        finish();
    }

    @Override
    public void handleTimerEvent(int timeoutState) {
        if (mState != timeoutState || mState == STATE_NONE) {
@@ -202,15 +192,4 @@ final class RoutingControlAction extends HdmiCecFeatureAction {
            finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
        }
    }

    private void invokeCallback(int result) {
        if (mCallback == null) {
            return;
        }
        try {
            mCallback.onComplete(result);
        } catch (RemoteException e) {
            // Do nothing.
        }
    }
}
Loading