示例#1
0
  public void createAlertWaiter() {
    mAlertsActive = true;
    // All mupdf library calls are performed on asynchronous tasks to avoid stalling
    // the UI. Some calls can lead to javascript-invoked requests to display an
    // alert dialog and collect a reply from the user. The task has to be blocked
    // until the user's reply is received. This method creates an asynchronous task,
    // the purpose of which is to wait of these requests and produce the dialog
    // in response, while leaving the core blocked. When the dialog receives the
    // user's response, it is sent to the core via replyToAlert, unblocking it.
    // Another alert-waiting task is then created to pick up the next alert.
    if (mAlertTask != null) {
      mAlertTask.cancel(true);
      mAlertTask = null;
    }
    if (mAlertDialog != null) {
      mAlertDialog.cancel();
      mAlertDialog = null;
    }
    mAlertTask =
        new AsyncTask<Void, Void, MuPDFAlert>() {

          @Override
          protected MuPDFAlert doInBackground(Void... arg0) {
            if (!mAlertsActive) return null;

            return core.waitForAlert();
          }

          @Override
          protected void onPostExecute(final MuPDFAlert result) {
            // core.waitForAlert may return null when shutting down
            if (result == null) return;
            final MuPDFAlert.ButtonPressed pressed[] = new MuPDFAlert.ButtonPressed[3];
            for (int i = 0; i < 3; i++) pressed[i] = MuPDFAlert.ButtonPressed.None;
            DialogInterface.OnClickListener listener =
                new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                    mAlertDialog = null;
                    if (mAlertsActive) {
                      int index = 0;
                      switch (which) {
                        case AlertDialog.BUTTON1:
                          index = 0;
                          break;
                        case AlertDialog.BUTTON2:
                          index = 1;
                          break;
                        case AlertDialog.BUTTON3:
                          index = 2;
                          break;
                      }
                      result.buttonPressed = pressed[index];
                      // Send the user's response to the core, so that it can
                      // continue processing.
                      core.replyToAlert(result);
                      // Create another alert-waiter to pick up the next alert.
                      createAlertWaiter();
                    }
                  }
                };
            mAlertDialog = mAlertBuilder.create();
            mAlertDialog.setTitle(result.title);
            mAlertDialog.setMessage(result.message);
            switch (result.iconType) {
              case Error:
                break;
              case Warning:
                break;
              case Question:
                break;
              case Status:
                break;
            }
            switch (result.buttonGroupType) {
              case OkCancel:
                mAlertDialog.setButton(AlertDialog.BUTTON2, getString(R.string.cancel), listener);
                pressed[1] = MuPDFAlert.ButtonPressed.Cancel;
              case Ok:
                mAlertDialog.setButton(AlertDialog.BUTTON1, getString(R.string.okay), listener);
                pressed[0] = MuPDFAlert.ButtonPressed.Ok;
                break;
              case YesNoCancel:
                mAlertDialog.setButton(AlertDialog.BUTTON3, getString(R.string.cancel), listener);
                pressed[2] = MuPDFAlert.ButtonPressed.Cancel;
              case YesNo:
                mAlertDialog.setButton(AlertDialog.BUTTON1, getString(R.string.yes), listener);
                pressed[0] = MuPDFAlert.ButtonPressed.Yes;
                mAlertDialog.setButton(AlertDialog.BUTTON2, getString(R.string.no), listener);
                pressed[1] = MuPDFAlert.ButtonPressed.No;
                break;
            }
            mAlertDialog.setOnCancelListener(
                new DialogInterface.OnCancelListener() {
                  public void onCancel(DialogInterface dialog) {
                    mAlertDialog = null;
                    if (mAlertsActive) {
                      result.buttonPressed = MuPDFAlert.ButtonPressed.None;
                      core.replyToAlert(result);
                      createAlertWaiter();
                    }
                  }
                });

            mAlertDialog.show();
          }
        };

    mAlertTask.executeOnExecutor(new ThreadPerTaskExecutor());
  }