@SuppressLint("NewApi")
 private void enableWebDebugging(boolean enable) {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
     AppLog.i(T.EDITOR, "Enabling web debugging");
     WebView.setWebContentsDebuggingEnabled(enable);
   }
 }
  /**
   * Returns the contents of the content field from the JavaScript editor. Should be called from a
   * background thread where possible.
   */
  @Override
  public CharSequence getContent() {
    if (!isAdded()) {
      return "";
    }

    if (mSourceView != null && mSourceView.getVisibility() == View.VISIBLE) {
      mContentHtml = mSourceViewContent.getText().toString();
      return StringUtils.notNullStr(mContentHtml);
    }

    if (Looper.myLooper() == Looper.getMainLooper()) {
      AppLog.d(T.EDITOR, "getContent() called from UI thread");
    }

    mGetContentCountDownLatch = new CountDownLatch(1);

    // All WebView methods must be called from the UI thread
    getActivity()
        .runOnUiThread(
            new Runnable() {
              @Override
              public void run() {
                mWebView.execJavaScriptFromString(
                    "ZSSEditor.getField('zss_field_content').getHTMLForCallback();");
              }
            });

    try {
      mGetContentCountDownLatch.await(1, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
      AppLog.e(T.EDITOR, e);
      Thread.currentThread().interrupt();
    }

    return StringUtils.notNullStr(mContentHtml);
  }
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
   if (item.getItemId() == BUTTON_ID_LOG_HTML) {
     if (mDebugModeEnabled) {
       // Log the raw html
       mWebView.post(
           new Runnable() {
             @Override
             public void run() {
               mWebView.execJavaScriptFromString("console.log(document.body.innerHTML);");
             }
           });
     } else {
       AppLog.d(AppLog.T.EDITOR, "Could not execute JavaScript - debug mode not enabled");
     }
     return true;
   } else {
     return super.onOptionsItemSelected(item);
   }
 }
  public boolean hasChanges(NoteDetail otherNote) {

    AppLog.i("title equals:" + !StringUtils.equals(title, otherNote.title));
    AppLog.i("content equals:" + !StringUtils.equals(content, otherNote.content));
    AppLog.i("notebookid equals:" + !StringUtils.equals(noteBookId, otherNote.noteBookId));
    AppLog.i("isMarkDown equal:" + (isMarkDown != otherNote.isMarkDown));
    AppLog.i("tags equals:" + !StringUtils.equals(tags, otherNote.tags));
    AppLog.i("isblog equals:" + (isPublicBlog != otherNote.isPublicBlog));

    return otherNote == null
        || !StringUtils.equals(title, otherNote.title)
        || !StringUtils.equals(content, otherNote.content)
        || !StringUtils.equals(noteBookId, otherNote.noteBookId)
        || isMarkDown != otherNote.isMarkDown
        || !StringUtils.equals(tags, otherNote.tags)
        || isPublicBlog != otherNote.isPublicBlog;
  }
  @Override
  public void onClick(View v) {
    int id = v.getId();
    if (id == R.id.format_bar_button_html) {
      // Don't switch to HTML mode if currently uploading media
      //            if (!mUploadingMediaIds.isEmpty()) {
      //                ((ToggleButton) v).setChecked(false);
      //
      //                if (isAdded()) {
      //                    ToastUtils.showToast(getActivity(),
      // R.string.alert_html_toggle_uploading, ToastUtils.Duration.LONG);
      //                }
      //                return;
      //            }

      clearFormatBarButtons();
      updateFormatBarEnabledState(true);

      if (((ToggleButton) v).isChecked()) {
        mSourceViewTitle.setText(getTitle());

        SpannableString spannableContent = new SpannableString(getContent());
        HtmlStyleUtils.styleHtmlForDisplay(spannableContent);
        mSourceViewContent.setText(spannableContent);

        mWebView.setVisibility(View.GONE);
        mSourceView.setVisibility(View.VISIBLE);

        mSourceViewContent.requestFocus();
        mSourceViewContent.setSelection(0);

        InputMethodManager imm =
            ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE));
        imm.showSoftInput(mSourceViewContent, InputMethodManager.SHOW_IMPLICIT);
      } else {
        mWebView.setVisibility(View.VISIBLE);
        mSourceView.setVisibility(View.GONE);

        mTitle = mSourceViewTitle.getText().toString();
        mContentHtml = mSourceViewContent.getText().toString();
        updateVisualEditorFields();

        mWebView.execJavaScriptFromString("ZSSEditor.getField('zss_field_content').focus();");
      }
    } else if (id == R.id.format_bar_button_media) {
      ((ToggleButton) v).setChecked(false);

      if (mSourceView.getVisibility() == View.VISIBLE) {
        ToastUtils.showToast(
            getActivity(), R.string.alert_insert_image_html_mode, ToastUtils.Duration.LONG);
      } else {
        mEditorFragmentListener.onAddMediaClicked();
        if (isAdded()) {
          getActivity().openContextMenu(mTagToggleButtonMap.get(TAG_FORMAT_BAR_BUTTON_MEDIA));
        }
      }
    } else if (id == R.id.format_bar_button_link) {
      if (!((ToggleButton) v).isChecked()) {
        // The link button was checked when it was pressed; remove the current link
        mWebView.execJavaScriptFromString("ZSSEditor.unlink();");
        return;
      }

      ((ToggleButton) v).setChecked(false);

      LinkDialogFragment linkDialogFragment = new LinkDialogFragment();
      linkDialogFragment.setTargetFragment(this, LinkDialogFragment.LINK_DIALOG_REQUEST_CODE_ADD);

      Bundle dialogBundle = new Bundle();

      // Pass selected text to dialog
      if (mSourceView.getVisibility() == View.VISIBLE) {
        // HTML mode
        mSelectionStart = mSourceViewContent.getSelectionStart();
        mSelectionEnd = mSourceViewContent.getSelectionEnd();

        String selectedText =
            mSourceViewContent.getText().toString().substring(mSelectionStart, mSelectionEnd);
        dialogBundle.putString("linkText", selectedText);
      } else {
        // Visual mode
        mGetSelectedTextCountDownLatch = new CountDownLatch(1);
        mWebView.execJavaScriptFromString("ZSSEditor.execFunctionForResult('getSelectedText');");
        try {
          if (mGetSelectedTextCountDownLatch.await(1, TimeUnit.SECONDS)) {
            dialogBundle.putString("linkText", mJavaScriptResult);
          }
        } catch (InterruptedException e) {
          AppLog.d(AppLog.T.EDITOR, "Failed to obtain selected text from JS editor.");
        }
      }

      linkDialogFragment.setArguments(dialogBundle);
      linkDialogFragment.show(getFragmentManager(), "LinkDialogFragment");
    } else {
      if (v instanceof ToggleButton) {
        onFormattingButtonClicked((ToggleButton) v);
      }
    }
  }
 @Override
 public void onImageLoaded(String localFileId) {
   AppLog.i("download, reload webview...");
   mWebView.reload();
 }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_share_note);

    // Set up the action bar.
    final ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
      actionBar.setElevation(0.0f);
      actionBar.setDisplayHomeAsUpEnabled(true);
      actionBar.setHomeButtonEnabled(true);
    }

    FragmentManager fragmentManager = getFragmentManager();
    Bundle extras = getIntent().getExtras();
    String action = getIntent().getAction();

    if (savedInstanceState == null) {
      if (extras != null) {
        // Load post from the postId passed in extras
        long localNoteId = extras.getLong(EXTRA_NOTEID, 0L);

        mNote = Leanote.leaDB.getLocalNoteById(localNoteId);
        AppLog.i("mnote:" + mNote);
      } else {
        // A postId extra must be passed to this activity
        showErrorAndFinish(R.string.note_not_found);
        return;
      }
    }

    // Ensure we have a valid post
    if (mNote == null) {
      showErrorAndFinish(R.string.note_not_found);
      return;
    }

    setTitle(StringUtils.unescapeHTML("Share Notes"));

    publishToLeaBlog = (Button) findViewById(R.id.share_note_blog_btn);
    publishToLeaBlog.setOnClickListener(
        new Button.OnClickListener() {
          @Override
          public void onClick(View v) {
            mNote.setIsPublicBlog(true);
            Leanote.leaDB.updateNote(mNote);
            Toast.makeText(getApplicationContext(), "Publish to Lea++ Blog", Toast.LENGTH_LONG)
                .show();
          }
        });

    sendMailBtn = (Button) findViewById(R.id.share_note_mail_btn);
    //        mailAddrEditText = (EditText) findViewById(R.id.sourceview_mail_addr);
    //        pwdEditText = (EditText) findViewById(R.id.sourceview_mail_pwd);
    sendMailBtn.setOnClickListener(
        new Button.OnClickListener() {
          @Override
          public void onClick(View v) {
            //                if( mailAddrEditText.getText().length() == 0 ) {
            //                    Toast.makeText(getApplicationContext(), "Please input you e-mail
            // address", Toast.LENGTH_LONG).show();
            //                }
            //
            //                if( pwdEditText.getText().length() == 0 ) {
            //                    Toast.makeText(getApplicationContext(), "Please input you e-mail
            // password", Toast.LENGTH_LONG).show();
            //                }

            Intent data = new Intent(Intent.ACTION_SENDTO);
            data.setData(Uri.parse("mailto:"));
            data.putExtra(Intent.EXTRA_SUBJECT, mNote.getTitle());
            data.putExtra(Intent.EXTRA_TEXT, mNote.getContent());
            startActivity(data);
          }
        });
  }