@Override
  protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
    AbstractInputMethodService target = mTarget.get();
    if (target == null) {
      return;
    }
    if (target.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
        != PackageManager.PERMISSION_GRANTED) {

      fout.println(
          "Permission Denial: can't dump InputMethodManager from from pid="
              + Binder.getCallingPid()
              + ", uid="
              + Binder.getCallingUid());
      return;
    }

    CountDownLatch latch = new CountDownLatch(1);
    mCaller.executeOrSendMessage(mCaller.obtainMessageOOOO(DO_DUMP, fd, fout, args, latch));
    try {
      if (!latch.await(5, TimeUnit.SECONDS)) {
        fout.println("Timeout waiting for dump");
      }
    } catch (InterruptedException e) {
      fout.println("Interrupted waiting for dump");
    }
  }
 @Override
 public IVoiceInteractorRequest startCommand(
     String callingPackage,
     IVoiceInteractorCallback callback,
     String command,
     Bundle extras) {
   Request request = newRequest(callback);
   mHandlerCaller.sendMessage(
       mHandlerCaller.obtainMessageOOOO(
           MSG_START_COMMAND,
           new Caller(callingPackage, Binder.getCallingUid()),
           request,
           command,
           extras));
   return request.mInterface;
 }
 @Override
 public IVoiceInteractorRequest startConfirmation(
     String callingPackage,
     IVoiceInteractorCallback callback,
     CharSequence prompt,
     Bundle extras) {
   Request request = newRequest(callback);
   mHandlerCaller.sendMessage(
       mHandlerCaller.obtainMessageOOOO(
           MSG_START_CONFIRMATION,
           new Caller(callingPackage, Binder.getCallingUid()),
           request,
           prompt,
           extras));
   return request.mInterface;
 }
 @Override
 public IVoiceInteractorRequest startAbortVoice(
     String callingPackage,
     IVoiceInteractorCallback callback,
     CharSequence message,
     Bundle extras) {
   Request request = newRequest(callback);
   mHandlerCaller.sendMessage(
       mHandlerCaller.obtainMessageOOOO(
           MSG_START_ABORT_VOICE,
           new Caller(callingPackage, Binder.getCallingUid()),
           request,
           message,
           extras));
   return request.mInterface;
 }