@Override
  public void onReceive(Context context, Intent intent) {
    LogHandler.configureLogger();

    try {
      String log = "onReceive: Action: ";
      log += intent.getAction();
      log += "( ";
      if (intent.getData() != null) {
        log += intent.getData().getScheme();
        log += "://";
        log += intent.getData().getHost();
      }
      log += " ) ";
      Bundle extras = intent.getExtras();
      log += "{ ";
      if (extras != null) {
        for (String extra : extras.keySet()) {
          log += extra + "[" + extras.get(extra) + "], ";
        }
      }
      log += " }";
      Log.d(this, log);
    } catch (Exception e) {
      Log.e(e);
    }

    try {
      if (ExternalAppConstants.SLEEP_AS_ANDROID_ALARM_EVENT
          .ALARM_TRIGGERED
          .getIntentAction()
          .equals(intent.getAction())) {
        Log.d("IntentReceiver", "Alarm triggered!");
        ActionHandler.execute(
            context, ExternalAppConstants.SLEEP_AS_ANDROID_ALARM_EVENT.ALARM_TRIGGERED);

      } else if (ExternalAppConstants.SLEEP_AS_ANDROID_ALARM_EVENT
          .ALARM_SNOOZED
          .getIntentAction()
          .equals(intent.getAction())) {
        Log.d("IntentReceiver", "Alarm snoozed...");
        ActionHandler.execute(
            context, ExternalAppConstants.SLEEP_AS_ANDROID_ALARM_EVENT.ALARM_SNOOZED);

      } else if (ExternalAppConstants.SLEEP_AS_ANDROID_ALARM_EVENT
          .ALARM_DISMISSED
          .getIntentAction()
          .equals(intent.getAction())) {
        Log.d("IntentReceiver", "Alarm dismissed...");
        ActionHandler.execute(
            context, ExternalAppConstants.SLEEP_AS_ANDROID_ALARM_EVENT.ALARM_DISMISSED);

      } else {
        Log.d("IntentReceiver", "Received unknown intent: " + intent.getAction());
      }

    } catch (Exception e) {
      Log.e(e);
    }
  }
  private void parseActionIntent(Context context, Intent intent) {
    try {
      long id = Long.valueOf(intent.getData().getHost());
      Timer timer = DatabaseHandler.getTimer(id);

      Calendar currentTime = Calendar.getInstance();
      if (Build.VERSION.SDK_INT < 19) {
        int currentHour = currentTime.get(Calendar.HOUR_OF_DAY);
        int executionHour = timer.getExecutionTime().get(Calendar.HOUR_OF_DAY);
        if (currentHour != executionHour) {
          Log.d(
              this,
              "Timer hour doesnt match: "
                  + currentHour
                  + " != "
                  + timer.getExecutionTime().get(Calendar.HOUR_OF_DAY));
          return;
        }

        int currentMinute = currentTime.get(Calendar.MINUTE);
        int executionMinute = timer.getExecutionTime().get(Calendar.MINUTE);
        if (!(currentMinute >= executionMinute && currentMinute <= executionMinute + 3)) {
          Log.d(
              this,
              "Timer minute not in valid range: currentMinute: "
                  + currentMinute
                  + " ; executionMinute: "
                  + executionMinute);
          return;
        }
      }

      Log.d(this, "executing timer...");
      switch (timer.getExecutionType()) {
        case Timer.EXECUTION_TYPE_WEEKDAY:
          WeekdayTimer weekdayTimer = (WeekdayTimer) timer;

          if (weekdayTimer.containsExecutionDay(currentTime.get(Calendar.DAY_OF_WEEK))) {
            ActionHandler.execute(context, timer);
          } else {
            Log.d(this, "timer executionDays doesn't contain current day, not executing timer");
          }
          break;
        case Timer.EXECUTION_TYPE_INTERVAL:
          ActionHandler.execute(context, timer);
          break;
        default:
          Log.e(this, "Unknown Timer executionType: " + timer.getExecutionType());
          break;
      }

    } catch (Exception e) {
      StatusMessageHandler.showErrorMessage(context, e);
    }

    reinitializeAlarms(context);
  }
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.d("Updating Room Widgets...");
    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i = 0; i < appWidgetIds.length; i++) {
      int appWidgetId = appWidgetIds[i];
      RemoteViews remoteViews =
          new RemoteViews(
              context.getResources().getString(eu.power_switch.shared.R.string.PACKAGE_NAME),
              R.layout.widget_room);

      try {
        RoomWidget roomWidget = DatabaseHandler.getRoomWidget(appWidgetId);
        Room room = DatabaseHandler.getRoom(roomWidget.getRoomId());
        if (room != null) {
          Apartment apartment = DatabaseHandler.getApartment(room.getApartmentId());

          // update UI
          remoteViews.setTextViewText(
              R.id.textView_room_widget_name, apartment.getName() + ": " + room.getName());

          // set button action
          remoteViews.setOnClickPendingIntent(
              R.id.button_on,
              WidgetIntentReceiver.buildRoomWidgetButtonPendingIntent(
                  context,
                  apartment,
                  room,
                  context.getString(R.string.on),
                  ConfigureRoomWidgetActivity.ROOM_INTENT_ID_OFFSET + appWidgetId));
          remoteViews.setOnClickPendingIntent(
              R.id.button_off,
              WidgetIntentReceiver.buildRoomWidgetButtonPendingIntent(
                  context,
                  apartment,
                  room,
                  context.getString(R.string.off),
                  ConfigureRoomWidgetActivity.ROOM_INTENT_ID_OFFSET + appWidgetId + 1));
          remoteViews.setViewVisibility(R.id.linearlayout_room_widget, View.VISIBLE);
        } else {
          remoteViews.setTextViewText(
              R.id.textView_room_widget_name, context.getString(R.string.room_not_found));
          remoteViews.setViewVisibility(R.id.linearlayout_room_widget, View.GONE);
        }
      } catch (Exception e) {
        Log.e(e);
        remoteViews.setTextViewText(
            R.id.textView_room_widget_name, context.getString(R.string.unknown_error));
        remoteViews.setViewVisibility(R.id.linearlayout_room_widget, View.GONE);
      }
      appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
  }
  @Override
  public void onReceive(Context context, Intent intent) {
    LogHandler.configureLogger();

    Log.d(this, intent);

    try {
      if (intent.getAction().equals(TimerConstants.TIMER_ACTIVATION_INTENT)) {
        Log.d(this, "parsing timer activation intent...");
        parseActionIntent(context, intent);
      } else if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
        // restart all active alarms because device rebooted
        Log.d(this, "restarting all active alarms because device rebooted...");
        reinitializeAlarms(context);
      } else {
        Log.d(this, "Received unknown intent: " + intent.getAction());
      }
    } catch (Exception e) {
      Log.e(e);
    }
  }
 @Override
 public void onDeleted(Context context, int[] appWidgetIds) {
   Log.d("Deleting Room Widgets: " + Arrays.toString(appWidgetIds));
   for (int appWidgetId : appWidgetIds) {
     try {
       DatabaseHandler.deleteRoomWidget(appWidgetId);
     } catch (Exception e) {
       Log.e(e);
     }
   }
   super.onDeleted(context, appWidgetIds);
 }