com.google.gwt.sample.mobilewebapp.presenter.tasklist.TaskListPresenter.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.sample.mobilewebapp.presenter.tasklist.TaskListPresenter.java

Source

/*
 * 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);
    }
}