| /* |
| * 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.client; |
| |
| import com.google.gwt.activity.shared.ActivityManager; |
| import com.google.gwt.activity.shared.ActivityMapper; |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.place.shared.PlaceController; |
| import com.google.gwt.place.shared.PlaceHistoryHandler; |
| import com.google.gwt.sample.gaerequest.client.GaeAuthRequestTransport; |
| import com.google.gwt.sample.gaerequest.client.ReloadOnAuthenticationFailure; |
| import com.google.gwt.sample.mobilewebapp.client.activity.AppActivityMapper; |
| import com.google.gwt.sample.mobilewebapp.client.activity.AppPlaceHistoryMapper; |
| import com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskEditView; |
| import com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskListView; |
| import com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskReadView; |
| import com.google.gwt.sample.mobilewebapp.client.desktop.MobileWebAppShellDesktop; |
| import com.google.gwt.sample.mobilewebapp.client.ui.PieChart; |
| import com.google.gwt.sample.mobilewebapp.presenter.task.TaskEditView; |
| import com.google.gwt.sample.mobilewebapp.presenter.task.TaskReadView; |
| import com.google.gwt.sample.mobilewebapp.presenter.taskchart.TaskChartPresenter; |
| import com.google.gwt.sample.mobilewebapp.presenter.tasklist.TaskListView; |
| import com.google.gwt.sample.mobilewebapp.shared.MobileWebAppRequestFactory; |
| import com.google.gwt.storage.client.Storage; |
| import com.google.gwt.user.client.Window; |
| import com.google.web.bindery.event.shared.EventBus; |
| import com.google.web.bindery.event.shared.SimpleEventBus; |
| import com.google.web.bindery.requestfactory.shared.RequestTransport; |
| |
| /** |
| * Default implementation of {@link ClientFactory}. Used by desktop version. |
| */ |
| class ClientFactoryImpl implements ClientFactory { |
| |
| /** |
| * The URL argument used to enable or disable local storage. |
| */ |
| private static final String STORAGE_URL_ARG = "storage"; |
| |
| private final EventBus eventBus = new SimpleEventBus(); |
| private final PlaceController placeController = new PlaceController(eventBus); |
| private final MobileWebAppRequestFactory requestFactory; |
| private MobileWebAppShell shell; |
| private final Storage localStorage; |
| private final TaskProxyLocalStorage taskProxyLocalStorage; |
| private TaskEditView taskEditView; |
| private TaskListView taskListView; |
| private ActivityManager activityManager; |
| |
| private final AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class); |
| |
| /** |
| * The stock GWT class that ties the PlaceController to browser history, |
| * configured by our custom {@link #historyMapper}. |
| */ |
| private final PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper); |
| |
| private TaskReadView taskReadView; |
| |
| public ClientFactoryImpl() { |
| RequestTransport requestTransport = new GaeAuthRequestTransport(eventBus); |
| requestFactory = GWT.create(MobileWebAppRequestFactory.class); |
| requestFactory.initialize(eventBus, requestTransport); |
| |
| // Initialize local storage. |
| String storageUrlValue = Window.Location.getParameter(STORAGE_URL_ARG); |
| if (storageUrlValue == null || storageUrlValue.startsWith("t")) { |
| localStorage = Storage.getLocalStorageIfSupported(); |
| } else { |
| localStorage = null; |
| } |
| taskProxyLocalStorage = new TaskProxyLocalStorage(localStorage); |
| } |
| |
| public App getApp() { |
| return new App(getLocalStorageIfSupported(), eventBus, getPlaceController(), |
| getActivityManager(), historyMapper, historyHandler, new ReloadOnAuthenticationFailure(), |
| getShell()); |
| } |
| |
| @Override |
| public EventBus getEventBus() { |
| return eventBus; |
| } |
| |
| public PlaceController getPlaceController() { |
| return placeController; |
| } |
| |
| public MobileWebAppRequestFactory getRequestFactory() { |
| return requestFactory; |
| } |
| |
| public MobileWebAppShell getShell() { |
| if (shell == null) { |
| shell = createShell(); |
| } |
| return shell; |
| } |
| |
| public TaskEditView getTaskEditView() { |
| if (taskEditView == null) { |
| taskEditView = createTaskEditView(); |
| } |
| return taskEditView; |
| } |
| |
| public TaskListView getTaskListView() { |
| if (taskListView == null) { |
| taskListView = createTaskListView(); |
| } |
| return taskListView; |
| } |
| |
| public TaskProxyLocalStorage getTaskProxyLocalStorage() { |
| return taskProxyLocalStorage; |
| } |
| |
| public TaskReadView getTaskReadView() { |
| if (taskReadView == null) { |
| taskReadView = createTaskReadView(); |
| } |
| return taskReadView; |
| } |
| |
| /** |
| * ActivityMapper determines an Activity to run for a particular place, |
| * configures the {@link #getActivityManager()} |
| */ |
| protected ActivityMapper createActivityMapper() { |
| return new AppActivityMapper(this); |
| } |
| |
| /** |
| * Create the application UI shell. |
| * |
| * @return the UI shell |
| */ |
| protected MobileWebAppShell createShell() { |
| PieChart pieChart = PieChart.createIfSupported(); |
| TaskChartPresenter presenter = null; |
| if (pieChart != null) { |
| presenter = new TaskChartPresenter(pieChart); |
| presenter.start(getEventBus()); |
| } |
| return new MobileWebAppShellDesktop(eventBus, presenter, placeController, getTaskListView(), |
| getTaskEditView(), getTaskReadView()); |
| } |
| |
| /** |
| * Create a {@link TaskEditView}. |
| * |
| * @return a new {@link TaskEditView} |
| */ |
| protected TaskEditView createTaskEditView() { |
| return new DesktopTaskEditView(); |
| } |
| |
| /** |
| * Create a {@link TaskListView}. |
| * |
| * @return a new {@link TaskListView} |
| */ |
| protected TaskListView createTaskListView() { |
| return new DesktopTaskListView(); |
| } |
| |
| protected TaskReadView createTaskReadView() { |
| return new DesktopTaskReadView(); |
| } |
| |
| /** |
| * Owns a panel in the window, in this case the entire {@link #shell}. |
| * Monitors the {@link #eventBus} for |
| * {@link com.google.gwt.place.shared.PlaceChangeEvent PlaceChangeEvent}s posted by the |
| * {@link #placeController}, and chooses what |
| * {@link com.google.gwt.activity.shared.Activity Activity} gets to take |
| * over the panel at the current place. Configured by the |
| * {@link #createActivityMapper()}. |
| */ |
| protected ActivityManager getActivityManager() { |
| if (activityManager == null) { |
| activityManager = new ActivityManager(createActivityMapper(), eventBus); |
| } |
| return activityManager; |
| } |
| |
| private Storage getLocalStorageIfSupported() { |
| return localStorage; |
| } |
| } |