content: /*
   * Copyright 2016, The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package <%= appPackage %>.statistics;
  
  import android.support.annotation.NonNull;
  
  import <%= appPackage %>.data.Task;
  import <%= appPackage %>.data.source.TasksDataSource;
  import <%= appPackage %>.data.source.TasksRepository;
  import <%= appPackage %>.util.EspressoIdlingResource;
  
  import java.util.List;
  
  import static com.google.common.base.Preconditions.checkNotNull;
  
  /**
   * Listens to user actions from the UI ({@link StatisticsFragment}), retrieves the data and updates
   * the UI as required.
   */
  public class StatisticsPresenter implements StatisticsContract.Presenter {
  
      private final TasksRepository mTasksRepository;
  
      private final StatisticsContract.View mStatisticsView;
  
      public StatisticsPresenter(@NonNull TasksRepository tasksRepository,
                                 @NonNull StatisticsContract.View statisticsView) {
          mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
          mStatisticsView = checkNotNull(statisticsView, "StatisticsView cannot be null!");
  
          mStatisticsView.setPresenter(this);
      }
  
      @Override
      public void start() {
          loadStatistics();
      }
  
      private void loadStatistics() {
          mStatisticsView.setProgressIndicator(true);
  
          // The network request might be handled in a different thread so make sure Espresso knows
          // that the app is busy until the response is handled.
          EspressoIdlingResource.increment(); // App is busy until further notice
  
          mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() {
              @Override
              public void onTasksLoaded(List<Task> tasks) {
                  int activeTasks = 0;
                  int completedTasks = 0;
  
                  // This callback may be called twice, once for the cache and once for loading
                  // the data from the server API, so we check before decrementing, otherwise
                  // it throws "Counter has been corrupted!" exception.
                  if (!EspressoIdlingResource.getIdlingResource().isIdleNow()) {
                      EspressoIdlingResource.decrement(); // Set app as idle.
                  }
  
                  // We calculate number of active and completed tasks
                  for (Task task : tasks) {
                      if (task.isCompleted()) {
                          completedTasks += 1;
                      } else {
                          activeTasks += 1;
                      }
                  }
                  // The view may not be able to handle UI updates anymore
                  if (!mStatisticsView.isActive()) {
                      return;
                  }
                  mStatisticsView.setProgressIndicator(false);
  
                  mStatisticsView.showStatistics(activeTasks, completedTasks);
              }
  
              @Override
              public void onDataNotAvailable() {
                  // The view may not be able to handle UI updates anymore
                  if (!mStatisticsView.isActive()) {
                      return;
                  }
                  mStatisticsView.showLoadingStatisticsError();
              }
          });
      }
  }
  