HDMICEC: Set common callback logic for shell cmd

Create a common set of callback objects and fields for reuse in
different commands that may need callback.

Bug: 177973980
Test: adb shell cmd hdmi_control otp
Change-Id: I194b7886f0a15cd7fafa6f43dec9b5a02c55b06e
Merged-In: I194b7886f0a15cd7fafa6f43dec9b5a02c55b06e
This commit is contained in:
Venkatarama NG. Avadhani
2021-01-18 18:23:37 +05:30
committed by Venkatarama Avadhani
parent 23cca12865
commit 571f0de1ff

View File

@@ -35,9 +35,23 @@ final class HdmiControlShellCommand extends ShellCommand {
private final IHdmiControlService.Stub mBinderService; private final IHdmiControlService.Stub mBinderService;
final CountDownLatch mLatch;
AtomicInteger mCecResult;
IHdmiControlCallback.Stub mHdmiControlCallback;
HdmiControlShellCommand(IHdmiControlService.Stub binderService) { HdmiControlShellCommand(IHdmiControlService.Stub binderService) {
mBinderService = binderService; mBinderService = binderService;
mLatch = new CountDownLatch(1);
mCecResult = new AtomicInteger();
mHdmiControlCallback =
new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
getOutPrintWriter().println(" done (" + getResultString(result) + ")");
mCecResult.set(result);
mLatch.countDown();
}
};
} }
@Override @Override
@@ -88,28 +102,14 @@ final class HdmiControlShellCommand extends ShellCommand {
} }
private int oneTouchPlay(PrintWriter pw) throws RemoteException { private int oneTouchPlay(PrintWriter pw) throws RemoteException {
final CountDownLatch latch = new CountDownLatch(1);
AtomicInteger cecResult = new AtomicInteger();
pw.print("Sending One Touch Play..."); pw.print("Sending One Touch Play...");
mBinderService.oneTouchPlay(new IHdmiControlCallback.Stub() { mBinderService.oneTouchPlay(mHdmiControlCallback);
@Override
public void onComplete(int result) {
pw.println(" done (" + result + ")");
latch.countDown();
cecResult.set(result);
}
});
try { if (!receiveCallback("One Touch Play")) {
if (!latch.await(HdmiConfig.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
getErrPrintWriter().println("One Touch Play timed out.");
return 1; return 1;
} }
} catch (InterruptedException e) {
getErrPrintWriter().println("Caught InterruptedException"); return mCecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1;
Thread.currentThread().interrupt();
}
return cecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1;
} }
private int vendorCommand(PrintWriter pw) throws RemoteException { private int vendorCommand(PrintWriter pw) throws RemoteException {
@@ -157,4 +157,37 @@ final class HdmiControlShellCommand extends ShellCommand {
mBinderService.sendVendorCommand(deviceType, destination, params, hasVendorId); mBinderService.sendVendorCommand(deviceType, destination, params, hasVendorId);
return 0; return 0;
} }
private boolean receiveCallback(String command) {
try {
if (!mLatch.await(HdmiConfig.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
getErrPrintWriter().println(command + " timed out.");
return false;
}
} catch (InterruptedException e) {
getErrPrintWriter().println("Caught InterruptedException");
Thread.currentThread().interrupt();
}
return true;
}
private String getResultString(int result) {
switch (result) {
case HdmiControlManager.RESULT_SUCCESS:
return "Success";
case HdmiControlManager.RESULT_TIMEOUT:
return "Timeout";
case HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE:
return "Source not available";
case HdmiControlManager.RESULT_TARGET_NOT_AVAILABLE:
return "Target not available";
case HdmiControlManager.RESULT_EXCEPTION:
return "Exception";
case HdmiControlManager.RESULT_INCORRECT_MODE:
return "Incorrect mode";
case HdmiControlManager.RESULT_COMMUNICATION_FAILED:
return "Communication Failed";
}
return Integer.toString(result);
}
} }