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

Commit d25c1d09 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Initial implementation of 'cmd voiceinteraction'." into rvc-dev am: edcb2c38

Change-Id: Ifd926338a993a8b5697f1bc7843e071ca3296295
parents 2d7f36ca edcb2c38
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -56,6 +56,8 @@ import android.os.Parcel;
import android.os.RemoteCallback;
import android.os.RemoteCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.Trace;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.UserManagerInternal;
import android.os.UserManagerInternal;
@@ -1390,6 +1392,13 @@ public class VoiceInteractionManagerService extends SystemService {
            mSoundTriggerInternal.dump(fd, pw, args);
            mSoundTriggerInternal.dump(fd, pw, args);
        }
        }


        @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
        @Override
        public void setUiHints(Bundle hints) {
        public void setUiHints(Bundle hints) {
            synchronized (this) {
            synchronized (this) {
+135 −0
Original line number Original line Diff line number Diff line
/*
 * 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;
    }
}