private void setAlarm(int trigId, TimeTrigDesc desc) {

    // Cancel the pending intent and the existing alarm first
    cancelAlarm(trigId, desc.toString());

    Log.v(TAG, "TimeTriggerService: Attempting to set trigger " + trigId);

    Intent i = createAlarmIntent(trigId, desc.toString());
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);

    long alarmTime = getAlarmTimeInMillis(trigId, desc);
    if (alarmTime == -1) {
      Log.v(TAG, "TimeTriggerService: No valid time found for " + trigId);
      return;
    }

    /* Convert the alarm time to elapsed real time.
     * If we dont do this, a time change in the system might
     * set off all the alarms and a trigger might go off before
     * we get a chance to cancel it
     */
    long elapsedRT = alarmTime - System.currentTimeMillis();
    if (elapsedRT <= 0) {
      Log.v(
          TAG, "TimeTriggerService: negative elapsed realtime - " + "alarm not setting: " + trigId);
      return;
    }

    Log.v(TAG, "TimeTriggerService: Setting alarm for " + elapsedRT + " millis into the future");

    mAlarmMan.set(
        AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + elapsedRT, pi);
  }
  private Calendar getTriggerTimeForDay(int trigId, TimeTrigDesc trigDesc, int dayOffset) {

    Calendar target = Calendar.getInstance();
    target.add(Calendar.DAY_OF_YEAR, dayOffset);

    String dayStr = TimeTrigDesc.getDayOfWeekString(target.get(Calendar.DAY_OF_WEEK));

    if (!trigDesc.doesRepeatOnDay(dayStr)) {
      return null;
    }

    if (dayOffset == 0) {
      return getTriggerTimeForToday(trigId, trigDesc);
    }

    target.set(Calendar.SECOND, 0);
    if (!trigDesc.isRandomized()) {
      target.set(Calendar.HOUR_OF_DAY, trigDesc.getTriggerTime().getHour());
      target.set(Calendar.MINUTE, trigDesc.getTriggerTime().getMinute());
    } else {
      target.set(Calendar.HOUR_OF_DAY, trigDesc.getRangeStart().getHour());
      target.set(Calendar.MINUTE, trigDesc.getRangeStart().getMinute());

      int diff = trigDesc.getRangeStart().differenceInMinutes(trigDesc.getRangeEnd());
      Random rand = new Random();
      // Generate a random number (both ranges inclusive)
      target.add(Calendar.MINUTE, rand.nextInt(diff + 1));
    }

    return target;
  }
  private void setTrigger(int trigId, String trigDesc) {

    Log.v(TAG, "TimeTriggerService: Attempting to set " + "the trigger: " + trigId);

    TimeTrigDesc desc = new TimeTrigDesc();
    if (desc.loadString(trigDesc)) {
      setAlarm(trigId, desc);
    } else {
      Log.e(TAG, "TimeTriggerService: Failed to parse" + " trigger config: id = " + trigId);
    }
  }
  private Calendar getTriggerTimeForToday(int trigId, TimeTrigDesc trigDesc) {

    TimeTrigger timeTrig = new TimeTrigger();
    if (timeTrig.hasTriggeredToday(this, trigId)) {
      return null;
    }

    Calendar now = Calendar.getInstance();

    Calendar target = Calendar.getInstance();
    target.set(Calendar.SECOND, 0);

    if (!trigDesc.isRandomized()) {
      target.set(Calendar.HOUR_OF_DAY, trigDesc.getTriggerTime().getHour());
      target.set(Calendar.MINUTE, trigDesc.getTriggerTime().getMinute());

      if (now.before(target)) {
        return target;
      }
    } else { // if randomized, check if there is any more time left in the interval
      SimpleTime tCurr = new SimpleTime();
      SimpleTime tStart = trigDesc.getRangeStart();
      SimpleTime tEnd = trigDesc.getRangeEnd();

      if (tCurr.isBefore(tEnd)) {

        int diff;
        if (tCurr.isAfter(tStart)) {
          diff = tCurr.differenceInMinutes(tEnd);
          target.set(Calendar.HOUR_OF_DAY, tCurr.getHour());
          target.set(Calendar.MINUTE, tCurr.getMinute());
        } else {
          diff = tStart.differenceInMinutes(tEnd);
          target.set(Calendar.HOUR_OF_DAY, tStart.getHour());
          target.set(Calendar.MINUTE, tStart.getMinute());
        }

        Random rand = new Random();
        // Generate a random number (both ranges inclusive)
        target.add(Calendar.MINUTE, rand.nextInt(diff + 1));
        return target;
      }
    }

    return null;
  }