private void metadataProcess()

in Android/app/src/main/java/com/harvard/studyappmodule/SurveyActivitiesFragment.java [921:1486]


  private void metadataProcess() {

    for (int i = 0; i < arrayList.size(); i++) {}

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    SimpleDateFormat dateSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat timezoneSimpleDateFormat = new SimpleDateFormat("Z");
    Date date;

    ArrayList<String> activityIds = new ArrayList<>();
    ArrayList<String> runIds = new ArrayList<>();

    if (activityListData != null) {
      for (int i = 0; i < activityListData.getActivities().size(); i++) {
        if (activityListData.getActivities().get(i).getSchedulingType() != null) {
          if (activityListData
              .getActivities()
              .get(i)
              .getSchedulingType()
              .equalsIgnoreCase("AnchorDate")) {
            for (int j = 0; j < arrayList.size(); j++) {
              if (activityListData
                  .getActivities()
                  .get(i)
                  .getActivityId()
                  .equalsIgnoreCase(arrayList.get(j).getTargetActivityId())) {
                if (arrayList.get(j).getAnchorDate() != null
                    && !arrayList.get(j).getAnchorDate().equalsIgnoreCase("")) {
                  String startTime = "";
                  String endTime = "";
                  if (activityListData.getActivities().get(i).getAnchorDate() != null
                      && activityListData.getActivities().get(i).getAnchorDate().getStart()
                          != null) {
                    if (!activityListData
                        .getActivities()
                        .get(i)
                        .getAnchorDate()
                        .getStart()
                        .getTime()
                        .equalsIgnoreCase("")) {
                      startTime =
                          activityListData
                              .getActivities()
                              .get(i)
                              .getAnchorDate()
                              .getStart()
                              .getTime();
                    } else {
                      startTime = "00:00:00";
                    }
                  }
                  if (activityListData.getActivities().get(i).getAnchorDate() != null
                      && activityListData.getActivities().get(i).getAnchorDate().getEnd() != null) {
                    if (!activityListData
                        .getActivities()
                        .get(i)
                        .getAnchorDate()
                        .getEnd()
                        .getTime()
                        .equalsIgnoreCase("")) {
                      endTime =
                          activityListData
                              .getActivities()
                              .get(i)
                              .getAnchorDate()
                              .getEnd()
                              .getTime();
                    } else {
                      endTime = "23:59:59";
                    }
                  }

                  // to do run calculation and expecting source question has answered
                  RealmResults<ActivityRun> runs =
                      dbServiceSubscriber.getAllActivityRunFromDB(
                          activityListData.getStudyId(),
                          activityListData.getActivities().get(i).getActivityId(),
                          realm);
                  if (runs == null || runs.size() == 0) {
                    activityUpdated = true;
                    activityIds.add(activityListData.getActivities().get(i).getActivityId());
                    runIds.add("-1");
                  }

                  if (activityListData
                      .getActivities()
                      .get(i)
                      .getFrequency()
                      .getType()
                      .equalsIgnoreCase("One Time")) {
                    Calendar calendar;
                    if (activityListData.getActivities().get(i).getAnchorDate() != null
                        && activityListData.getActivities().get(i).getAnchorDate().getStart()
                            != null) {
                      calendar = Calendar.getInstance();
                      try {
                        date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                        calendar.setTime(date);
                        calendar.add(
                            Calendar.DATE,
                            activityListData
                                .getActivities()
                                .get(i)
                                .getAnchorDate()
                                .getStart()
                                .getAnchorDays());
                      } catch (ParseException e) {
                        Logger.log(e);
                      }

                      activityListData
                          .getActivities()
                          .get(i)
                          .setStartTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + startTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                    if (activityListData.getActivities().get(i).getAnchorDate() != null
                        && activityListData.getActivities().get(i).getAnchorDate().getEnd()
                            != null) {
                      calendar = Calendar.getInstance();
                      try {
                        date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                        calendar.setTime(date);
                        calendar.add(
                            Calendar.DATE,
                            activityListData
                                .getActivities()
                                .get(i)
                                .getAnchorDate()
                                .getEnd()
                                .getAnchorDays());
                      } catch (ParseException e) {
                        Logger.log(e);
                      }

                      activityListData
                          .getActivities()
                          .get(i)
                          .setEndTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + endTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                  } else if (activityListData
                      .getActivities()
                      .get(i)
                      .getFrequency()
                      .getType()
                      .equalsIgnoreCase("Daily")) {
                    if (activityListData
                        .getActivities()
                        .get(i)
                        .getStartTime()
                        .equalsIgnoreCase("")) {
                      Calendar calendar = Calendar.getInstance();
                      try {
                        date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                        calendar.setTime(date);
                        calendar.add(
                            Calendar.DATE,
                            activityListData
                                .getActivities()
                                .get(i)
                                .getAnchorDate()
                                .getStart()
                                .getAnchorDays());
                      } catch (ParseException e) {
                        Logger.log(e);
                      }
                      activityListData
                          .getActivities()
                          .get(i)
                          .setStartTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + startTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                    if (activityListData.getActivities().get(i).getEndTime().equalsIgnoreCase("")) {
                      Calendar calendar = Calendar.getInstance();
                      try {
                        calendar.setTime(
                            simpleDateFormat.parse(
                                activityListData.getActivities().get(i).getStartTime()));
                      } catch (ParseException e) {
                        Logger.log(e);
                      }
                      calendar.add(
                          Calendar.DATE,
                          activityListData
                              .getActivities()
                              .get(i)
                              .getAnchorDate()
                              .getEnd()
                              .getRepeatInterval());
                      activityListData
                          .getActivities()
                          .get(i)
                          .setEndTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + endTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                  } else if (activityListData
                      .getActivities()
                      .get(i)
                      .getFrequency()
                      .getType()
                      .equalsIgnoreCase("Weekly")) {
                    if (activityListData
                        .getActivities()
                        .get(i)
                        .getStartTime()
                        .equalsIgnoreCase("")) {
                      Calendar calendar = Calendar.getInstance();
                      try {
                        date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                        calendar.setTime(date);
                        calendar.add(
                            Calendar.DATE,
                            activityListData
                                .getActivities()
                                .get(i)
                                .getAnchorDate()
                                .getStart()
                                .getAnchorDays());
                      } catch (ParseException e) {
                        Logger.log(e);
                      }

                      activityListData
                          .getActivities()
                          .get(i)
                          .setStartTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + startTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                    if (activityListData.getActivities().get(i).getEndTime().equalsIgnoreCase("")) {
                      Calendar calendar = Calendar.getInstance();
                      try {
                        calendar.setTime(
                            simpleDateFormat.parse(
                                activityListData.getActivities().get(i).getStartTime()));
                      } catch (ParseException e) {
                        Logger.log(e);
                      }
                      calendar.add(
                          Calendar.WEEK_OF_YEAR,
                          activityListData
                              .getActivities()
                              .get(i)
                              .getAnchorDate()
                              .getEnd()
                              .getRepeatInterval());
                      activityListData
                          .getActivities()
                          .get(i)
                          .setEndTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + endTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                  } else if (activityListData
                      .getActivities()
                      .get(i)
                      .getFrequency()
                      .getType()
                      .equalsIgnoreCase("Monthly")) {
                    if (activityListData
                        .getActivities()
                        .get(i)
                        .getStartTime()
                        .equalsIgnoreCase("")) {
                      Calendar calendar = Calendar.getInstance();
                      try {
                        date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                        calendar.setTime(date);
                        calendar.add(
                            Calendar.DATE,
                            activityListData
                                .getActivities()
                                .get(i)
                                .getAnchorDate()
                                .getStart()
                                .getAnchorDays());
                      } catch (ParseException e) {
                        Logger.log(e);
                      }
                      activityListData
                          .getActivities()
                          .get(i)
                          .setStartTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + startTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                    if (activityListData.getActivities().get(i).getEndTime().equalsIgnoreCase("")) {
                      Calendar calendar = Calendar.getInstance();
                      try {
                        calendar.setTime(
                            simpleDateFormat.parse(
                                activityListData.getActivities().get(i).getStartTime()));
                      } catch (ParseException e) {
                        Logger.log(e);
                      }
                      calendar.add(
                          Calendar.MONTH,
                          activityListData
                              .getActivities()
                              .get(i)
                              .getAnchorDate()
                              .getEnd()
                              .getRepeatInterval());
                      activityListData
                          .getActivities()
                          .get(i)
                          .setEndTime(
                              dateSimpleDateFormat.format(calendar.getTime())
                                  + "T"
                                  + endTime
                                  + ".000"
                                  + timezoneSimpleDateFormat.format(calendar.getTime()));
                    }
                  } else {
                    // custom runs
                    if (activityListData.getActivities().get(i).getStartTime().equalsIgnoreCase("")
                        && activityListData
                            .getActivities()
                            .get(i)
                            .getEndTime()
                            .equalsIgnoreCase("")) {
                      Calendar startCalendar;
                      Calendar endCalendar;
                      for (int k = 0;
                          k
                              < activityListData
                                  .getActivities()
                                  .get(i)
                                  .getFrequency()
                                  .getAnchorRuns()
                                  .size();
                          k++) {
                        startCalendar = Calendar.getInstance();
                        endCalendar = Calendar.getInstance();

                        // start runs
                        try {
                          date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                          startCalendar.setTime(date);
                          startCalendar.add(
                              Calendar.DATE,
                              activityListData
                                  .getActivities()
                                  .get(i)
                                  .getFrequency()
                                  .getAnchorRuns()
                                  .get(k)
                                  .getStartDays());
                        } catch (ParseException e) {
                          Logger.log(e);
                        }
                        activityListData
                            .getActivities()
                            .get(i)
                            .getFrequency()
                            .getRuns()
                            .get(k)
                            .setStartTime(
                                dateSimpleDateFormat.format(startCalendar.getTime())
                                    + "T"
                                    + activityListData
                                        .getActivities()
                                        .get(i)
                                        .getFrequency()
                                        .getAnchorRuns()
                                        .get(k)
                                        .getStartTime()
                                    + ".000"
                                    + timezoneSimpleDateFormat.format(startCalendar.getTime()));

                        // end runs
                        try {
                          date = simpleDateFormat.parse(arrayList.get(j).getAnchorDate());
                          endCalendar.setTime(date);
                          endCalendar.add(
                              Calendar.DATE,
                              activityListData
                                  .getActivities()
                                  .get(i)
                                  .getFrequency()
                                  .getAnchorRuns()
                                  .get(k)
                                  .getEndDays());
                        } catch (ParseException e) {
                          Logger.log(e);
                        }
                        activityListData
                            .getActivities()
                            .get(i)
                            .getFrequency()
                            .getRuns()
                            .get(k)
                            .setEndTime(
                                dateSimpleDateFormat.format(endCalendar.getTime())
                                    + "T"
                                    + activityListData
                                        .getActivities()
                                        .get(i)
                                        .getFrequency()
                                        .getAnchorRuns()
                                        .get(k)
                                        .getEndTime()
                                    + ".000"
                                    + timezoneSimpleDateFormat.format(endCalendar.getTime()));

                        activityListData
                            .getActivities()
                            .get(i)
                            .setStartTime(
                                activityListData
                                    .getActivities()
                                    .get(i)
                                    .getFrequency()
                                    .getRuns()
                                    .get(0)
                                    .getStartTime());
                        activityListData
                            .getActivities()
                            .get(i)
                            .setEndTime(
                                activityListData
                                    .getActivities()
                                    .get(i)
                                    .getFrequency()
                                    .getRuns()
                                    .get(k)
                                    .getEndTime());
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    // If any activities available in Db we take from Db otherwise from Webservice

    // find any updates on available activity
    if (activityDataDB != null && activityListData != null) {
      for (int j = 0; j < activityListData.getActivities().size(); j++) {
        boolean activityAvailable = false;
        for (int i = 0; i < activityDataDB.getActivities().size(); i++) {

          if (activityDataDB
              .getActivities()
              .get(i)
              .getActivityId()
              .equalsIgnoreCase(activityListData.getActivities().get(j).getActivityId())) {
            activityAvailable = true;
            if (!activityDataDB
                .getActivities()
                .get(i)
                .getActivityVersion()
                .equalsIgnoreCase(activityListData.getActivities().get(j).getActivityVersion())) {
              activityUpdated = true;
              // update ActivityWS DB with new version
              dbServiceSubscriber.updateActivitiesWsVersion(
                  activityListData.getActivities().get(j).getActivityId(),
                  activityListData.getStudyId(),
                  realm,
                  activityListData.getActivities().get(j).getActivityVersion());
              dbServiceSubscriber.updateActivityPreferenceVersion(
                  context,
                  activityListData.getActivities().get(j).getActivityVersion(),
                  activityDataDB.getActivities().get(i));
              if (activityIds.contains(activityDataDB.getActivities().get(i).getActivityId())) {
                // change on 15/10/2019

                runIds.set(
                    activityIds.indexOf(activityDataDB.getActivities().get(i).getActivityId()),
                    activityDataDB.getActivities().get(i).getActivityRunId());
              } else {
                // change on 15/10/2019
                activityIds.add(activityDataDB.getActivities().get(i).getActivityId());

                runIds.add(activityDataDB.getActivities().get(i).getActivityRunId());
              }
            }
            break;
          }
        }
        // change on 16/10/2019
        if (!activityAvailable) {
          ActivitiesWS activitiesWS =
              dbServiceSubscriber.getActivityObj(
                  activityListData.getActivities().get(j).getActivityId(),
                  activityListData.getStudyId(),
                  realm);
          if (activitiesWS != null
              && !activitiesWS
                  .getActivityVersion()
                  .equalsIgnoreCase(activityListData.getActivities().get(j).getActivityVersion())) {
            activityUpdated = true;
            // update ActivityWS DB with new version
            dbServiceSubscriber.updateActivitiesWsVersion(
                activityListData.getActivities().get(j).getActivityId(),
                activityListData.getStudyId(),
                realm,
                activityListData.getActivities().get(j).getActivityVersion());
            if (!activityIds.contains(activityListData.getActivities().get(j).getActivityId())) {

              activityIds.add(activityListData.getActivities().get(j).getActivityId());

              runIds.add("-1");
            }
          }
        }
      }
    } else if (activityDataDB == null && activityListData != null) {
      for (int j = 0; j < activityListData.getActivities().size(); j++) {
        ActivitiesWS activitiesWS =
            dbServiceSubscriber.getActivityObj(
                activityListData.getActivities().get(j).getActivityId(),
                activityListData.getStudyId(),
                realm);
        if (activitiesWS != null
            && !activitiesWS
                .getActivityVersion()
                .equalsIgnoreCase(activityListData.getActivities().get(j).getActivityVersion())) {
          activityUpdated = true;
          // update ActivityWS DB with new version
          dbServiceSubscriber.updateActivitiesWsVersion(
              activityListData.getActivities().get(j).getActivityId(),
              activityListData.getStudyId(),
              realm,
              activityListData.getActivities().get(j).getActivityVersion());
          if (!activityIds.contains(activityListData.getActivities().get(j).getActivityId())) {

            activityIds.add(activityListData.getActivities().get(j).getActivityId());

            runIds.add("-1");
          }
        }
      }
    }

    displayData(activityListData, activityIds, runIds, null);
  }