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 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() + "-");
 }
    @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());
      }
    }
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
   // TODO Auto-generated method stub
   super.onUpdate(context, appWidgetManager, appWidgetIds);
   Log.i(TAG, "onUpdate");
   Intent service = new Intent(context, CalculatorAppWidgetService.class);
   context.startService(service);
   for (int i = 0; i < appWidgetIds.length; i++) {
     RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.widget_main);
     if (appWidgetIds[appWidgetIds.length - 1] > theMaxWidgetID) {
       theMaxWidgetID = appWidgetIds[appWidgetIds.length - 1];
       CalculatorWidgetEntity entity = new CalculatorWidgetEntity();
       entity.setView(view);
       entity.setViewId(appWidgetIds[i]);
       entity.setFormula("");
       entity.setResult("");
       mEntities.add(entity);
     }
     updateWidget(context, view, appWidgetIds[i]);
     appWidgetManager.updateAppWidget(appWidgetIds, view);
   }
 }
 public int evaluate(String expr) {
   if (expr.equalsIgnoreCase("")) {
     return EMPTY;
   }
   entity.setFormula(mTokenizer.getLocalizedExpression(expr));
   expr = mTokenizer.getNormalizedExpression(expr);
   while (expr.length() > 0 && ".+-/*".indexOf(expr.charAt(expr.length() - 1)) != -1) {
     expr = expr.substring(0, expr.length() - 1);
   }
   try {
     double result = mSymbols.eval(expr);
     if (Double.isNaN(result)) {
       return NAN; // "NaN";
     } else {
       entity.setResult(
           mTokenizer.getLocalizedExpression(
               Util.doubleToString(result, MAX_DIGITS, ROUNDING_DIGITS)));
       return RESULT; // "result";
     }
   } catch (SyntaxException e) {
     return SYNTAX; // "syntax";
   }
 }
 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 deleteClick() {
   if (entity.getFormula().length() > 0) {
     entity.setFormula(entity.getFormula().substring(0, entity.getFormula().length() - 1));
   }
 }
 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 zeroClick() {
   entity.setFormula(entity.getFormula() + "0");
 }