package com.geek_alarm.android; import android.os.AsyncTask; import android.util.Log; import com.geek_alarm.android.db.TaskTypeDao; import com.geek_alarm.android.tasks.TaskManager; import com.geek_alarm.android.tasks.TaskType; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Runs update task: get all task types from server and update local copy. * If we have new task - set default difficulty - MEDIUM. */ public class UpdateTaskTypesAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { try { Map<String, TaskType> latestTasks = byType(TaskManager.getTaskTypes()); Map<String, TaskType> storedTasks = byType(TaskTypeDao.INSTANCE.getAll()); Set<String> allTypes = new HashSet<String>(); allTypes.addAll(latestTasks.keySet()); allTypes.addAll(storedTasks.keySet()); for (String type : allTypes) { TaskType latest = latestTasks.get(type); TaskType stored = storedTasks.get(type); if (latest != null && stored == null) { // Task is new. Add it to database. TaskTypeDao.INSTANCE.add(latest); } else if (latest == null && stored != null) { // Task was removed on server. Delete it. TaskTypeDao.INSTANCE.delete(stored); } else { // Task may changed. Check it and update if necessary. diffAndUpdate(latest, stored); } } } catch (Exception e) { Log.e(UpdateTaskTypesAsyncTask.class.getName(), "Error during updating task", e); } return null; } private void diffAndUpdate(TaskType latest, TaskType stored) { boolean same = latest.getName().equals(stored.getName()) && latest.getDescription().equals(stored.getDescription()); if (!same) { latest.setLevel(stored.getLevel()); TaskTypeDao.INSTANCE.update(latest); } } private Map<String, TaskType> byType(List<TaskType> taskTypes) { Map<String, TaskType> result = new HashMap<String, TaskType>(); for (TaskType taskType : taskTypes) { result.put(taskType.getType(), taskType); } return result; } }