@Override
  public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo menuInfo = null;
    try {
      menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    } catch (ClassCastException e) {
      log("bad menuInfoIn e=" + e);
      return super.onContextItemSelected(item);
    }

    if (mDialpadItem == null) {
      mDialpadItem = mItemAdapter.getItem(mContextMenuIdx);
    }
    String name = mDialpadItem.getName();
    String number = mDialpadItem.getNumber();
    long contactId = mDialpadItem.getContactId();
    log("onContextItemSelected: name=" + name + " number=" + number + " contactId=" + contactId);
    switch (item.getItemId()) {
      case R.id.menu_new_contact:
        CommonMethod.newContact(this, number);
        break;

      case R.id.menu_add_to_contacts:
        CommonMethod.createContact(this, number);
        break;

      case R.id.menu_view_contact:
        CommonMethod.viewContact(this, contactId);
        break;

      case R.id.menu_send_message:
        CommonMethod.sendMessage(this, number, null);
        break;

      case R.id.menu_delete_log:
        CommonMethod.showConfirmDlg(
            this,
            R.string.clear_call_log_by_number_confirm,
            R.string.alert_dialog_title,
            new DelCallLogItemListener());
        break;

      case R.id.menu_log_detail:
        CommonMethod.viewPimDetail(this, name, number, contactId, DetailEntry.LOG_DETAIL);
        break;

      case R.id.menu_add_to_blacklist:
        CommonMethod.addToBlacklist(this, name, number);
        break;

      case R.id.menu_clear_from_blacklist:
        CommonMethod.clearFromBlacklist(this, name, number);
        break;

      default:
        break;
    }

    return super.onContextItemSelected(item);
  }
  @Override
  public void call(String number) {
    // Woody Guo @ 2012/05/24
    if (number.equals(MAGIC_GENERATE_LOG_DATA)) {
      generateLog(true);
      mDialpad.setNumber(null);
      return;
    }
    if (number.equals(MAGIC_GENERATE_LOG_SDCARD)) {
      generateLog(false);
      mDialpad.setNumber(null);
      return;
    }
    // END

    // added by huizhang @2012/7/30
    if (number.equals(MAGIC_CALL_CIT)) {

      StartCit(true);
      mDialpad.setNumber(null);
      return;
    }
    // END

    CommonMethod.call(this, number);
  }
  @Override
  protected void onResume() {
    super.onResume();
    mPhotoLoader.resume();
    mNumLocationLoader.resume();
    setVolumeControlStream(AudioManager.STREAM_SYSTEM);

    PimEngine.getInstance(this).setCallLogsRead();
    CommonMethod.cancelMissedCallNotification(this);

    if (mHandler.hasMessages(RELOAD_DIALPADS)) {
      log("onResume");
      mHandler.removeMessages(RELOAD_DIALPADS);
      reloadDialpadItems();
    }
    mIsResume = true;
  }
  private void deleteCallLog(DialpadItem dialpadItem) {
    if (dialpadItem == null) {
      return;
    }

    String number = dialpadItem.getNumber();
    if (!TextUtils.isEmpty(number)) {
      if (number.length() < CommonMethod.MIN_NUMBER_LENGTH_ALLOWED_TO_ADD_IP) {
        getContentResolver().delete(Calls.CONTENT_URI, ("number='" + number + "'"), null);
      } else {
        // add by zenghuaying 2012.6.28 for bug 7961
        if (CommonMethod.isStartWithIpPrefix(this, number)) {
          number = number.substring(5);
        }
        getContentResolver().delete(Calls.CONTENT_URI, ("number LIKE '%" + number + "'"), null);
      }
    }
  }
 // add end
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
   if (R.id.menu_delete_log == item.getItemId()) {
     CommonMethod.showConfirmDlg(
         this,
         R.string.clear_all_call_log_confirm,
         R.string.alert_dialog_title,
         new OptionsMenuDelListener());
   } else if (R.id.menu_ip_call_settings == item.getItemId()) {
     Intent intent = new Intent(this, IpCallSettingsActivity.class);
     startActivity(intent);
   } else if (R.id.menu_calllog_settings == item.getItemId()) {
     Intent intent = new Intent(Intent.ACTION_MAIN);
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     intent.setClassName("com.android.phone", "com.android.phone.CallFeaturesSetting");
     startActivity(intent);
   }
   return true;
 }
  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    {
      super.onListItemClick(l, v, position, id);
      DialpadItem item = (DialpadItem) l.getItemAtPosition(position);
      String number = item.getNumber();
      long contactId = item.getContactId();
      String name = item.getName();
      SharedPreferences mPrefs = getSharedPreferences("call_log_settings", Context.MODE_PRIVATE);

      int mClickOption = mPrefs.getInt("call_log_click_option", 0);

      log("onListItemClick: " + position + " " + number + "Clickoption = " + mClickOption);
      if (!TextUtils.isEmpty(number)) {
        if (mClickOption == 0) {
          CommonMethod.viewPimDetail(
              this,
              name,
              number,
              contactId,
              (item.getType() == DialpadItem.CALLLOG_TYPE
                  ? DetailEntry.LOG_DETAIL
                  : DetailEntry.CONTACT_DETAIL));
        } else {
          // Added by GanFeng 20120213, fix bug3391
          if ((null != mDialpad) && TextUtils.isEmpty(mDialpad.getNumber())) {
            long timeElapsed = Math.abs(System.currentTimeMillis() - mDialpad.getTimeStamp());
            if (timeElapsed < 1000) { // the elapsed time < 1S
              return;
            }
          }
          if ((null != mDialpad) && !TextUtils.isEmpty(mDialpad.getNumber())) {
            mDialpad.setNumber(null);
            mDialpad.showNumberUI();
          }
          call(number);
        }
      }
    }
  }
 public void cancelMissedCallNotification() {
   log("cancelMissedCallNotification");
   PimEngine.getInstance(this).setCallLogsRead();
   CommonMethod.cancelMissedCallNotification(this);
 }
  @Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfoIn) {
    super.onCreateContextMenu(menu, v, menuInfoIn);
    if (v.getId() == R.id.edt_dpkb_call_number) {
      menu.removeItem(android.R.id.switchInputMethod);
      menu.removeItem(android.R.id.selectAll);
      menu.removeItem(android.R.id.startSelectingText);

      return;
    }
    if (menuInfoIn != null) {
      AdapterView.AdapterContextMenuInfo menuInfo = null;
      try {
        menuInfo = (AdapterView.AdapterContextMenuInfo) menuInfoIn;
      } catch (ClassCastException e) {
        log("bad menuInfoIn e = " + e);
        return;
      }

      mContextMenuIdx = menuInfo.position;
      mDialpadItem = mItemAdapter.getItem(mContextMenuIdx);
      String name = mDialpadItem.getName();
      String number = mDialpadItem.getNumber();
      long contactId = mDialpadItem.getContactId();
      log("onCreateContextMenu: name=" + name + " number=" + number + " contactId=" + contactId);
      if (!TextUtils.isEmpty(name)) {
        menu.setHeaderTitle(name);
      } else {
        if (number.equals(CallerInfo.UNKNOWN_NUMBER)) {
          number = getResources().getString(R.string.unknown);
        } else if (number.equals(CallerInfo.PRIVATE_NUMBER)) {
          number = getResources().getString(R.string.private_num);
        } else if (number.equals(CallerInfo.PAYPHONE_NUMBER)) {
          number = getResources().getString(R.string.payphone);
        }
        menu.setHeaderTitle(number);
      }

      if (DialpadItem.CALLLOG_TYPE == mDialpadItem.getType()) {
        menu.add(0, R.id.menu_log_detail, 0, R.string.view_calllog_detail);
      }

      menu.add(0, R.id.menu_send_message, 0, R.string.send_message);
      if (0 == contactId) {
        menu.add(0, R.id.menu_new_contact, 0, R.string.menu_newContact);
        // modify by zenghuaying fix bug #5705
        if (!CommonMethod.contactsIsEmpty(this)) {
          menu.add(0, R.id.menu_add_to_contacts, 0, R.string.menu_add_to_contacts);
        }
        // modify end
      } else {
        menu.add(0, R.id.menu_view_contact, 0, R.string.view_contact);
      }

      if (DialpadItem.CALLLOG_TYPE == mDialpadItem.getType()) {
        menu.add(0, R.id.menu_delete_log, 0, R.string.delete_call_log);
      }

      if (CommonMethod.numberIsInBlacklist(this, number)) {
        menu.add(0, R.id.menu_clear_from_blacklist, 0, R.string.clear_from_blacklist);
      } else {
        menu.add(0, R.id.menu_add_to_blacklist, 0, R.string.add_to_blacklist);
      }
    }
  }
 @Override
 public void sendMessage(String number) {
   // if (!CommonMethod.findContactByNumber(this, number)) {
   CommonMethod.sendMessage(this, number, null);
   // }
 }
 @Override
 public void newContact(String number) {
   // if (!CommonMethod.findContactByNumber(this, number)) {
   CommonMethod.newContact(this, number);
   // }
 }
 @Override
 public void enterContacts() {
   CommonMethod.enterContacts(this);
 }