@Override
 public void propertySet(String key, Object newValue, Object oldValue, boolean changedProperty) {
   AlertDialog dialog = (AlertDialog) dialogWrapper.getDialog();
   if (key.startsWith(TiC.PROPERTY_ACCESSIBILITY_PREFIX)) {
     if (dialog != null) {
       ListView listView = dialog.getListView();
       if (listView != null) {
         if (key.equals(TiC.PROPERTY_ACCESSIBILITY_HIDDEN)) {
           int importance = ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
           if (newValue != null && TiConvert.toBoolean(newValue)) {
             importance = ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO;
           }
           ViewCompat.setImportantForAccessibility(listView, importance);
         } else {
           listView.setContentDescription(composeContentDescription());
         }
       }
     }
     return;
   }
   switch (key) {
     case TiC.PROPERTY_TITLE:
       if (dialog != null) {
         dialog.setTitle(Html.fromHtml((String) newValue));
       } else {
         getBuilder().setTitle(Html.fromHtml(TiConvert.toString(newValue)));
       }
       break;
     case TiC.PROPERTY_MESSAGE:
       if (dialog != null) {
         dialog.setMessage(Html.fromHtml((String) newValue));
       } else {
         getBuilder().setMessage(Html.fromHtml(TiConvert.toString(newValue)));
       }
       break;
     case TiC.PROPERTY_BUTTON_NAMES:
       clearDialog();
       processButtons(TiConvert.toStringArray(newValue));
       break;
     case TiC.PROPERTY_OK:
       clearDialog();
       processButtons(new String[] {TiConvert.toString(newValue)});
       break;
     case TiC.PROPERTY_CUSTOM_VIEW:
       clearDialog();
       processView(newValue);
       break;
     case TiC.PROPERTY_PERSISTENT:
       dialogWrapper.setPersistent(TiConvert.toBoolean(newValue));
       break;
     case TiC.PROPERTY_CANCEL:
       cancelIndex = TiConvert.toInt(newValue, -1);
       break;
     case TiC.PROPERTY_OPTIONS:
       {
         mProcessUpdateFlags |= TIFLAG_NEEDS_OPTIONS;
         break;
       }
     case TiC.PROPERTY_SELECTED_INDEX:
       {
         mProcessUpdateFlags |= TIFLAG_NEEDS_OPTIONS;
         break;
       }
     case TiC.PROPERTY_HIDE_ON_CLICK:
       hideOnClick = TiConvert.toBoolean(newValue);
       if (dialog != null) {
         dialog.setCancelable(hideOnClick);
       }
       break;
     case TiC.PROPERTY_TAP_OUT_DISMISS:
       tapToDismiss = TiConvert.toBoolean(newValue);
       if (dialog != null) {
         dialog.setCanceledOnTouchOutside(tapToDismiss);
       }
       break;
     default:
       super.propertySet(key, newValue, oldValue, changedProperty);
       break;
   }
 }
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    mCanDeleteBrowsingHistory = PrefServiceBridge.getInstance().canDeleteBrowsingHistory();

    DialogOption[] options = getDialogOptions();
    String[] optionNames = new String[options.length];
    Resources resources = getResources();
    for (int i = 0; i < options.length; i++) {
      optionNames[i] = resources.getString(options[i].getResourceId());
    }
    mSelectedOptions = getDefaultDialogOptionsSelections();
    mAdapter = new ClearBrowsingDataAdapter(options, optionNames, getDisabledDialogOptions());
    final AlertDialog.Builder builder =
        new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme)
            .setTitle(R.string.clear_browsing_data_title)
            .setPositiveButton(R.string.clear_data_delete, this)
            .setNegativeButton(R.string.cancel, this)
            .setAdapter(mAdapter, null); // OnClickListener is registered manually.

    if (ChromeSigninController.get(getActivity()).isSignedIn()) {
      final String message = getString(R.string.clear_cookies_no_sign_out_summary);
      final SpannableString messageWithLink =
          SpanApplier.applySpans(
              message,
              new SpanApplier.SpanInfo(
                  "<link>",
                  "</link>",
                  new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
                      dismiss();
                      Preferences prefActivity = (Preferences) getActivity();
                      prefActivity.startFragment(AccountManagementFragment.class.getName(), null);
                    }

                    // Change link formatting to use no underline
                    @Override
                    public void updateDrawState(TextPaint textPaint) {
                      textPaint.setColor(textPaint.linkColor);
                      textPaint.setUnderlineText(false);
                    }
                  }));

      View view =
          getActivity().getLayoutInflater().inflate(R.layout.single_line_bottom_text_dialog, null);
      TextView summaryView = (TextView) view.findViewById(R.id.summary);
      summaryView.setText(messageWithLink);
      summaryView.setMovementMethod(LinkMovementMethod.getInstance());
      builder.setView(view);
    }

    mDialog = builder.create();
    mDialog
        .getListView()
        .setOnItemClickListener(
            new OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                // The present behaviour of AlertDialog is to dismiss after the onClick event.
                // Hence we are manually overriding this outside the builder.
                mAdapter.onClick(position);
              }
            });
    return mDialog;
  }
  public void show(KrollDict options) {
    AlertDialog dialog = (AlertDialog) dialogWrapper.getDialog();
    if (dialog == null) {
      if (dialogWrapper.getActivity() == null) {
        TiBaseActivity dialogActivity = (TiBaseActivity) getCurrentActivity();
        dialogWrapper.setActivity(new WeakReference<TiBaseActivity>(dialogActivity));
      }
      //			processProperties(proxy.getProperties());
      getBuilder()
          .setOnCancelListener(
              new OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dlg) {
                  int cancelIndex =
                      (proxy.hasProperty(TiC.PROPERTY_CANCEL))
                          ? TiConvert.toInt(proxy.getProperty(TiC.PROPERTY_CANCEL))
                          : -1;
                  Log.d(
                      TAG,
                      "onCancelListener called. Sending index: "
                          + cancelIndex
                          + ", hideOnClick: "
                          + hideOnClick,
                      Log.DEBUG_MODE);
                  handleEvent(cancelIndex, false);
                  if (hideOnClick == true) hide(null);
                }
              });
      dialog = getBuilder().create();
      dialog.setOnShowListener(
          new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
              TiApplication.getInstance().cancelPauseEvent();
            }
          });
      dialog.setCancelable(hideOnClick);
      dialog.setCanceledOnTouchOutside(tapToDismiss);

      dialog.setOnKeyListener(
          new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
              if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                if (proxy.hasListeners(TiC.EVENT_ANDROID_BACK)) {
                  proxy.fireEvent(TiC.EVENT_ANDROID_BACK);
                } else if (hideOnClick) {
                  handleEvent(cancelIndex, false);
                  hide(null);
                }
              }
              return true;
            }
          });

      // Initially apply accessibility properties here, the first time
      // the dialog actually becomes available. After this, propertyChanged
      // can also be used.
      ListView listView = dialog.getListView();
      if (listView != null) {
        listView.setContentDescription(composeContentDescription());
        int importance = ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
        if (proxy != null) {
          Object propertyValue = proxy.getProperty(TiC.PROPERTY_ACCESSIBILITY_HIDDEN);
          if (propertyValue != null && TiConvert.toBoolean(propertyValue)) {
            importance = ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO;
          }
        }
        ViewCompat.setImportantForAccessibility(listView, importance);
      }

      dialogWrapper.setDialog(dialog);
      builder = null;
    }

    try {
      Activity dialogActivity = dialogWrapper.getActivity();
      if (dialogActivity != null && !dialogActivity.isFinishing()) {
        if (dialogActivity instanceof TiBaseActivity) {
          // add dialog to its activity so we can clean it up later to prevent memory leak.
          ((TiBaseActivity) dialogActivity).addDialog(dialogWrapper);
          dialog.show();
          setButtonsListeners(dialog);
          fireEvent(TiC.EVENT_OPEN, null, false);
        }
      } else {
        dialog = null;
        Log.w(
            TAG,
            "Dialog activity is destroyed, unable to show dialog with message: "
                + TiConvert.toString(proxy.getProperty(TiC.PROPERTY_MESSAGE)));
      }
    } catch (Throwable t) {
      Log.w(TAG, "Context must have gone away: " + t.getMessage(), t);
    }
  }