/* * Copyright 2011 Google Inc. * * 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 com.google.gwt.sample.mobilewebapp.presenter.tasklist; import com.google.gwt.sample.mobilewebapp.client.ClientFactory; import com.google.gwt.sample.mobilewebapp.client.event.ShowTaskEvent; import com.google.gwt.sample.mobilewebapp.client.event.TaskListUpdateEvent; import com.google.gwt.sample.mobilewebapp.shared.TaskProxy; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import com.google.web.bindery.requestfactory.shared.Receiver; import com.google.web.bindery.requestfactory.shared.ServerFailure; import java.util.Collections; import java.util.List; /** * Activity that presents a list of tasks. */ public class TaskListPresenter implements TaskListView.Presenter { /** * The delay in milliseconds between calls to refresh the task list. */ private static final int REFRESH_DELAY = 5000; /** * A boolean indicating that we should clear the task list when started. */ private final boolean clearTaskList; private final ClientFactory clientFactory; private EventBus eventBus; /** * The refresh timer used to periodically refresh the task list. */ private Timer refreshTimer; public TaskListPresenter(ClientFactory clientFactory, boolean clearTaskList) { this.clientFactory = clientFactory; this.clearTaskList = clearTaskList; clientFactory.getTaskListView().setPresenter(this); } /** * Construct a new {@link TaskListPresenter}. * * @param clientFactory the {@link ClientFactory} of shared resources * @param place configuration for this activity */ public TaskListPresenter(ClientFactory clientFactory, TaskListPlace place) { this(clientFactory, place.isTaskListStale()); } @Override public Widget asWidget() { return getView().asWidget(); } @Override public String mayStop() { return null; // always happy to stop } public void selectTask(TaskProxy selected) { // Go into edit mode when a task is selected. eventBus.fireEvent(new ShowTaskEvent(selected)); } @Override public void start(EventBus eventBus) { this.eventBus = eventBus; // Add a handler to the 'add' button in the shell. clientFactory.getShell().setAddButtonVisible(true); // Clear the task list and display it. if (clearTaskList) { getView().clearList(); } // Create a timer to periodically refresh the task list. refreshTimer = new Timer() { @Override public void run() { refreshTaskList(); } }; // Load the saved task list from storage List<TaskProxy> list = clientFactory.getTaskProxyLocalStorage().getTasks(); setTasks(list); // Request the task list now. refreshTaskList(); } @Override public void stop() { eventBus = null; // Kill the refresh timer. if (refreshTimer != null) { refreshTimer.cancel(); } } private TaskListView getView() { return clientFactory.getTaskListView(); } /** * Refresh the task list. */ private void refreshTaskList() { clientFactory.getRequestFactory().taskRequest().findAllTasks().fire( new Receiver<List<TaskProxy>>() { @Override public void onFailure(ServerFailure error) { // ignore } @Override public void onSuccess(List<TaskProxy> response) { // Early exit if this activity has already been canceled. if (eventBus == null) { return; } // Display the tasks in the view. if (response == null) { response = Collections.<TaskProxy> emptyList(); } setTasks(response); // save the response to storage clientFactory.getTaskProxyLocalStorage().setTasks(response); // Restart the timer. refreshTimer.schedule(REFRESH_DELAY); } }); } /** * Set the list of tasks. */ private void setTasks(List<TaskProxy> tasks) { getView().setTasks(tasks); eventBus.fireEventFromSource(new TaskListUpdateEvent(tasks), this); } }