@Override
    public void onStart(Intent intent, int startId) {
      // TODO Auto-generated method stub
      super.onStart(intent, startId);
      Log.i(TAG, "intent=" + intent);
      if (intent == null) {
        return;
      }
      int widgetId = intent.getIntExtra("widgetId", -1);
      if (widgetId == -1) {
        return;
      }

      entity = queryEntityById(widgetId);
      if (entity != null) {}
      if (entity == null) {
        return;
      }
      if (mTokenizer == null) {
        mTokenizer = new CalculatorExpressionTokenizer(this);
      }
      if (mSymbols == null) {
        mSymbols = new Symbols();
      }

      Uri data = intent.getData();
      if (data != null) {
        int index = Integer.parseInt(data.getSchemeSpecificPart());
        if (isEvalClick) {
          if (index <= BUTTON_INDEX_9) {
            entity.setFormula("");
          }
          isEvalClick = false;
        }
        checkInput(index);
        if (index == BUTTON_INDEX_EQUAL) return;
      }
      if (entity.getView() != null) {
        int res = evaluate(entity.getFormula());
        entity.getView().setTextViewText(R.id.widget_formula, entity.getFormula());
        if (res == RESULT) {
          entity.getView().setTextViewText(R.id.widget_result, entity.getResult());
        } else {
          entity.getView().setTextViewText(R.id.widget_result, "");
        }
        AppWidgetManager.getInstance(this).updateAppWidget(widgetId, entity.getView());
      }
    }
 public void checkInput(int buttonId) {
   switch (buttonId) {
     case BUTTON_INDEX_0: // 0
       zeroClick();
       break;
     case BUTTON_INDEX_POINT: // .
       pointClick();
       break;
     case BUTTON_INDEX_EQUAL: // =
       evaluateClick();
       break;
     case BUTTON_INDEX_DIV: // /
     case BUTTON_INDEX_MUL: // *
     case BUTTON_INDEX_ADD: // +
       symbloClick(buttonId);
       break;
     case BUTTON_INDEX_SUB: // -
       subClick();
       break;
     case BUTTON_INDEX_DEL: // DEL
       deleteClick();
       break;
     case BUTTON_INDEX_CLEAR: // CLR
       entity.setFormula("");
       break;
     default:
       entity.setFormula(entity.getFormula() + buttonValues[buttonId]);
       break;
   }
 }
 public void evaluateClick() {
   if (entity.getFormula().equals("")) return;
   isEvalClick = true;
   int res = evaluate(entity.getFormula());
   if (res == NAN) {
     entity.setFormula("");
     entity.getView().setTextViewText(R.id.widget_result, getText(R.string.error_nan));
   } else if (res == RESULT) {
     entity.setFormula(entity.getResult());
     entity.getView().setTextViewText(R.id.widget_formula, entity.getResult());
   } else {
     entity.setFormula("");
     entity.getView().setTextViewText(R.id.widget_formula, getText(R.string.error_syntax));
     entity.getView().setTextViewText(R.id.widget_result, "");
   }
   AppWidgetManager.getInstance(this).updateAppWidget(entity.getViewId(), entity.getView());
 }
 public void symbloClick(int buttonId) {
   while (entity.getFormula().length() > 0
       && ".+−÷×".indexOf(entity.getFormula().charAt(entity.getFormula().length() - 1)) != -1) {
     entity.setFormula(entity.getFormula().substring(0, entity.getFormula().length() - 1));
   }
   if (entity.getFormula().length() > 0) {
     entity.setFormula(entity.getFormula() + buttonValues[buttonId]);
   }
 }
 public void subClick() {
   while (entity.getFormula().length() > 0
       && ".+−".indexOf(entity.getFormula().charAt(entity.getFormula().length() - 1)) != -1) {
     entity.setFormula(entity.getFormula().substring(0, entity.getFormula().length() - 1));
   }
   entity.setFormula(entity.getFormula() + "-");
 }
 public void pointClick() {
   if (entity.getFormula().equalsIgnoreCase("")) {
     entity.setFormula("0.");
   } else {
     int pointLastIndex = entity.getFormula().lastIndexOf(".");
     int subLastIndex = entity.getFormula().lastIndexOf("−"); // -
     int addLastIndex = entity.getFormula().lastIndexOf("+"); // +
     int divLastIndex = entity.getFormula().lastIndexOf("÷"); // ÷
     int mulLastIndex = entity.getFormula().lastIndexOf("×"); // ×
     int maxIndex = Math.max(divLastIndex, mulLastIndex);
     maxIndex = Math.max(maxIndex, addLastIndex);
     maxIndex = Math.max(maxIndex, subLastIndex);
     if (maxIndex == -1 && pointLastIndex == -1) {
       entity.setFormula(entity.getFormula() + ".");
     }
     if (pointLastIndex < maxIndex) {
       if (maxIndex == entity.getFormula().length() - 1) {
         entity.setFormula(entity.getFormula() + "0.");
       } else {
         entity.setFormula(entity.getFormula() + ".");
       }
     }
   }
 }
 public void deleteClick() {
   if (entity.getFormula().length() > 0) {
     entity.setFormula(entity.getFormula().substring(0, entity.getFormula().length() - 1));
   }
 }
 public void zeroClick() {
   entity.setFormula(entity.getFormula() + "0");
 }