@Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    DebugLogging.log(
        getApplicationContext(),
        (LOG_TAG
            + " onStartCommand handlerIsCreated "
            + handlerIsCreated
            + " "
            + (intent == null)));
    if ((intent != null)
        && (intent.getAction() != null)
        && (intent.getAction().equals(INSERT_DATA_ACTION))) {
      if (handlerIsCreated) {
        Message msg = thread.getHandler().obtainMessage();
        msg.arg1 = startId;

        msg.what = INSERT_DATA;
        msg.obj = intent.getExtras();
        thread.getHandler().sendMessage(msg);
      } else {
        needToSaveTransaction = true;
        bundle = intent.getExtras();
      }
    }

    return START_STICKY;
  }
 @Override
 public void onDestroy() {
   DebugLogging.log(getApplicationContext(), (LOG_TAG + " onDestroy"));
   if (myDBAdapter.isDatabaseOpen()) {
     myDBAdapter.close();
   }
   super.onDestroy();
 }
  @Override
  public void onCreate() {
    DebugLogging.log(getApplicationContext(), (LOG_TAG + " onCreate"));
    myDBAdapter = new MyDBAdapter(getApplicationContext());

    thread = new ServiceHandlerThread();
    thread.start();
  }
    @Override
    public void handleMessage(Message msg) {
      DebugLogging.log(getApplicationContext(), (LOG_TAG + " handleMessage " + msg.what));
      boolean loadResult = false;
      boolean deleteResult = false;

      if (!myDBAdapter.isDatabaseOpen()) {
        myDBAdapter.open();
      }

      switch (msg.what) {
        case GET_TRANSACTION_DATA:
          {
            try {
              Cursor transactionCursor = myDBAdapter.getTransactionWithFilter(msg.obj.toString());
              callbackObject.showTransactionData(transactionCursor);
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case GET_BALANCE:
          {
            try {
              String balanceValue = myDBAdapter.getBalance(msg.obj.toString());
              callbackObject.setBalance(balanceValue);
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case GET_CARDS_DATA:
          {
            try {
              Cursor cardsCursor = myDBAdapter.selectCardsNumber(msg.obj.toString());
              callbackObject.showCardsData(cardsCursor, msg.obj.toString());
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case INSERT_DATA:
          {
            Bundle bundle = (Bundle) msg.obj;
            TransactionData transactionData = new TransactionData(bundle);
            try {
              boolean insertResult = myDBAdapter.insertTransaction(transactionData);
              if (insertResult) {
                Intent updateIntent = new Intent(SMSBankingActivity.UPDATE_TRANSACTION_LIST_INTENT);
                getApplicationContext().sendBroadcast(updateIntent);
              }
            } catch (SQLiteException exc) {
              // TODO if error I should inform
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case UPDATE_CARD_ALIAS:
          {
            Bundle cardMap = (Bundle) msg.obj;
            try {
              Boolean updateResult =
                  myDBAdapter.updateCardAlias(
                      cardMap.getString(CARD_ALIAS_DATA), cardMap.getString(CARD_DATA));
              callbackObject.aliasUpdated(updateResult);
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case DELETE_DATA:
          {
            // for (int j = 0; j < 10000000; j++);
            try {
              myDBAdapter.beginDatabaseTranzaction();
              deleteResult = myDBAdapter.deleteData();
              if (deleteResult) {
                myDBAdapter.setSuccesfullTranzaction();
              }
              myDBAdapter.endDatabaseTranzaction();
              callbackObject.dataWasDeleted(deleteResult);
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case LOAD_DATA_FROM_SMS:
          {
            try {
              myDBAdapter.beginDatabaseTranzaction();
              // for (int j = 0; j < 10000000; j++);

              loadResult = loadDataFromSMS();
              if (loadResult) {
                myDBAdapter.setSuccesfullTranzaction();
              }
              myDBAdapter.endDatabaseTranzaction();
              callbackObject.dataWasLoaded(loadResult);
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case OPEN_DATABASE:
          {
            try {
              DebugLogging.log(getApplicationContext(), (LOG_TAG + " OPEN_DATABASE"));
              myDBAdapter.open();
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case DELETE_AND_LOAD_DATA_FROM_SMS:
          {
            try {
              myDBAdapter.beginDatabaseTranzaction();
              // for (int j = 0; j < 10000000; j++);
              deleteResult = myDBAdapter.deleteData();

              if (deleteResult) {
                loadResult = loadDataFromSMS();
                if (loadResult) {
                  myDBAdapter.setSuccesfullTranzaction();
                }
              }
              myDBAdapter.endDatabaseTranzaction();
              callbackObject.dataWasLoaded(loadResult);
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        case DELETE_CARD:
          {
            try {
              myDBAdapter.beginDatabaseTranzaction();
              if (myDBAdapter.deleteCardData(msg.obj.toString())) {
                myDBAdapter.setSuccesfullTranzaction();
              }
              myDBAdapter.endDatabaseTranzaction();
              callbackObject.cardDataWasDeleted();
            } catch (SQLiteException exc) {
              callbackObject.sqlLiteExceptionIsCatched();
              DebugLogging.log(getApplicationContext(), (LOG_TAG + exc.getMessage()));
            }
            break;
          }
        default:
          DebugLogging.log(
              getApplicationContext(), (LOG_TAG + " ServiceHandler handleMessage default tag"));
          break;
      }
    }
 @Override
 public IBinder onBind(Intent intent) {
   // for (int i = 0; i < 1000000; i++);
   DebugLogging.log(getApplicationContext(), (LOG_TAG + " onBind"));
   return myBinder;
 }