diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-05-28 04:40:20 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-05-28 04:40:20 +0000 |
commit | edcb2c38f4a06fbc4fe786e3a5f441d0ef69b55c (patch) | |
tree | 9fafc7b1524f62551cba3f5008464ae34571f7a4 | |
parent | 8acb04e23599c1f2ac2df1e125a7ecd539fd1384 (diff) | |
parent | b6ebc24b8659d268a2165433e8bf863461667cc2 (diff) |
Merge "Initial implementation of 'cmd voiceinteraction'." into rvc-dev
2 files changed, 144 insertions, 0 deletions
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index ef282ba110c5..cf07221917cc 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -56,6 +56,8 @@ import android.os.Parcel; import android.os.RemoteCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.os.ResultReceiver; +import android.os.ShellCallback; import android.os.Trace; import android.os.UserHandle; import android.os.UserManagerInternal; @@ -1391,6 +1393,13 @@ public class VoiceInteractionManagerService extends SystemService { } @Override + public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, + String[] args, ShellCallback callback, ResultReceiver resultReceiver) { + new VoiceInteractionManagerServiceShellCommand(mServiceStub) + .exec(this, in, out, err, args, callback, resultReceiver); + } + + @Override public void setUiHints(Bundle hints) { synchronized (this) { enforceIsCurrentVoiceInteractionService(); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java new file mode 100644 index 000000000000..3f4ddb6846ab --- /dev/null +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.voiceinteraction; + +import android.os.Bundle; +import android.os.RemoteException; +import android.os.ShellCommand; +import android.util.Slog; + +import com.android.internal.app.IVoiceInteractionSessionShowCallback; +import com.android.server.voiceinteraction.VoiceInteractionManagerService.VoiceInteractionManagerServiceStub; + +import java.io.PrintWriter; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Shell command for {@link VoiceInteractionManagerService}. + */ +final class VoiceInteractionManagerServiceShellCommand extends ShellCommand { + private static final String TAG = "VoiceInteractionManager"; + private static final long TIMEOUT_MS = 5_000; + + private final VoiceInteractionManagerServiceStub mService; + + VoiceInteractionManagerServiceShellCommand(VoiceInteractionManagerServiceStub service) { + mService = service; + } + + @Override + public int onCommand(String cmd) { + if (cmd == null) { + return handleDefaultCommands(cmd); + } + PrintWriter pw = getOutPrintWriter(); + switch (cmd) { + case "show": + return requestShow(pw); + case "hide": + return requestHide(pw); + default: + return handleDefaultCommands(cmd); + } + } + + @Override + public void onHelp() { + try (PrintWriter pw = getOutPrintWriter();) { + pw.println("VoiceInteraction Service (voiceinteraction) commands:"); + pw.println(" help"); + pw.println(" Prints this help text."); + pw.println(""); + pw.println(" show"); + pw.println(" Shows a session for the active service"); + pw.println(""); + pw.println(" hide"); + pw.println(" Hides the current session"); + pw.println(""); + } + } + + private int requestShow(PrintWriter pw) { + Slog.i(TAG, "requestShow()"); + CountDownLatch latch = new CountDownLatch(1); + AtomicInteger result = new AtomicInteger(); + + IVoiceInteractionSessionShowCallback callback = + new IVoiceInteractionSessionShowCallback.Stub() { + @Override + public void onFailed() throws RemoteException { + Slog.w(TAG, "onFailed()"); + pw.println("callback failed"); + result.set(1); + latch.countDown(); + } + + @Override + public void onShown() throws RemoteException { + Slog.d(TAG, "onShown()"); + result.set(0); + latch.countDown(); + } + }; + + try { + Bundle args = new Bundle(); + boolean ok = mService.showSessionForActiveService(args, /* sourceFlags= */ 0, callback, + /* activityToken= */ null); + + if (!ok) { + pw.println("showSessionForActiveService() returned false"); + return 1; + } + + if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { + pw.printf("Callback not called in %d ms\n", TIMEOUT_MS); + return 1; + } + } catch (Exception e) { + return handleError(pw, "showSessionForActiveService()", e); + } + + return 0; + } + + private int requestHide(PrintWriter pw) { + Slog.i(TAG, "requestHide()"); + try { + mService.hideCurrentSession(); + } catch (Exception e) { + return handleError(pw, "requestHide()", e); + } + return 0; + } + + private static int handleError(PrintWriter pw, String message, Exception e) { + Slog.e(TAG, "error calling " + message, e); + pw.printf("Error calling %s: %s\n", message, e); + return 1; + } +} |