Android Open Source - geoar-app Intro Controller






From Project

Back to project page geoar-app.

License

The source code is released under:

Apache License

If you think the Android project geoar-app listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2012 52North Initiative for Geospatial Open Source Software GmbH
 */*from  ww  w  .j  av a2s . c o m*/
 * 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 org.n52.geoar.ar.view;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

import org.n52.geoar.R;

import android.app.Activity;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.PopupWindow;
import android.widget.RelativeLayout.LayoutParams;

/**
 * 
 * @author Arne de Wall <a.dewall@52North.org>
 *
 */
public class IntroController {

  private static class TaskGraph {
    private class TaskNode {
      private Task step;
      private List<TaskNode> dependencies = new LinkedList<TaskNode>();

      TaskNode(Task step) {
        this.step = step;
      }

      private void addStepNode(TaskNode step) {
        this.dependencies.add(step);
      }

      private Task getStepByView(View view) {
        if (step.view == view)
          return step;
        Task step;
        for (TaskNode child : dependencies) {
          step = child.getStepByView(view);
          if (step != null)
            return step;
        }
        return null;
      }

      private Task getStepByRId(int rId) {
        if (step.description == rId)
          return step;
        Task step;
        for (TaskNode child : dependencies) {
          step = child.getStepByRId(rId);
          if (step != null)
            return step;
        }
        return null;
      }
    }

    private Queue<TaskNode> tasksQueue = new LinkedList<TaskNode>();
    private TaskNode currentTask;

    private TaskGraph() {
      initSearchStructure();
    }

    private void initSearchStructure() {
      // build up search structure
      TaskNode download = new TaskNode(stepMap.get(4));
      TaskNode select = new TaskNode(stepMap.get(6));
      TaskNode activate = new TaskNode(stepMap.get(9));
      tasksQueue.offer(download);
      tasksQueue.offer(select);
      tasksQueue.offer(activate);

      // Download Task
      TaskNode step1 = new TaskNode(stepMap.get(1));
      TaskNode step2 = new TaskNode(stepMap.get(2));
      TaskNode step3 = new TaskNode(stepMap.get(3));
      step2.addStepNode(step1);
      step3.addStepNode(step2);
      download.addStepNode(step3);

      // Select Task
      TaskNode step5 = new TaskNode(stepMap.get(5));
      select.addStepNode(step5);
      select.addStepNode(step2);

      // Activate Task
      TaskNode step7 = new TaskNode(stepMap.get(7));
      TaskNode step8 = new TaskNode(stepMap.get(8));

      activate.addStepNode(step7);
      activate.addStepNode(step8);

      currentTask = tasksQueue.poll();
    }

    public Task getCorrespondingTask(View view) {
      return currentTask.getStepByView(view);
    }

    public Task getCorrespondingTask(int id) {
      return currentTask.getStepByRId(id);
    }

    public void checkCondition(int id) {
      if (currentTask == null)
        return;
      if (currentTask.step.id == id) {
        currentTask = tasksQueue.poll();
        if (currentTask == null)
          skipIntro();
      }
    }

  }

  private static SparseArray<Task> stepMap;

  // todo init somewhere
  static {
    stepMap = new SparseArray<Task>();
    //@formatter:off
    stepMap.append(1, new Task(1,
        R.string.intro_task_1, R.string.intro_desc_1_1, 0, false){});
    stepMap.append(2, new Task(2,
        R.string.intro_task_1, R.string.intro_desc_1_2, 0, true){});
    stepMap.append(3, new Task(3,
        R.string.intro_task_1, R.string.intro_desc_1_3, 0, false){});
    stepMap.append(4, new Task(4,
        R.string.intro_task_1, R.string.intro_desc_1_4, R.drawable.intro_step_download, false){});
    stepMap.append(5, new Task(5,
        R.string.intro_task_2, R.string.intro_desc_2_1, 0, false){});
    stepMap.append(6, new Task(6,
        R.string.intro_task_2, R.string.intro_desc_2_2, 0, false){});
    stepMap.append(7, new Task(7,
        R.string.intro_task_3, R.string.intro_desc_3_1, 0, false){});
    stepMap.append(8, new Task(8,
        R.string.intro_task_3, R.string.intro_desc_3_2, 0, false){});
    stepMap.append(9, new Task(9,
        R.string.intro_task_3, R.string.intro_desc_3_3, 0, false){});
    stepMap.append(10, new Task(10,
        R.string.intro_task_3, R.string.intro_desc_3_4, 0, false){});
    //@formatter:on
    isActivated = true;
  }

  public static class Task implements Comparable<Task> {
    protected int index;

    protected boolean completed = false;
    protected boolean refreshPopupOnShow = false;

    protected int id;
    protected int description;

    protected int bitmapResource;
    protected View view;

    public Task(int index, int title, int description, int bitmapResource,
        boolean refreshOnPopup) {
      this.index = index;
      this.id = title;
      this.description = description;
      this.bitmapResource = bitmapResource;
      this.refreshPopupOnShow = refreshOnPopup;
    }

    @Override
    public int compareTo(Task another) {
      return this.index > another.index ? 1 : -1;
    }
  }

  static boolean isActivated = false;
  private static boolean started = false;
  private static PopupWindow popup;
  private static IntroViewer introViewer;
  private static Activity activity;

  private static TaskGraph graph;
  private static Task currentStep;

  private static View viewIndicator;
  private static Integer idIndicator;

  private static Object mutex = new Object();

  static Thread handler = new Thread(new Runnable() {

    private void waitForEvent() throws InterruptedException {
      synchronized (mutex) {
        while (idIndicator == null && viewIndicator == null)
          mutex.wait();
        if (viewIndicator == null) {
          final Task task = graph.getCorrespondingTask(idIndicator);
          if (task != null) {
            introViewer.updateView(task);
            if (task.refreshPopupOnShow)
              refreshPopup();
          }
          idIndicator = null;
        } else {
          final Task task = graph.getCorrespondingTask(viewIndicator);
          if (task != null) {
            introViewer.updateView(task);
            if (task.refreshPopupOnShow)
              refreshPopup();
          }
          viewIndicator = null;
        }
      }
    }

    @Override
    public void run() {
      synchronized (mutex) {
        if (currentStep == null) {
          currentStep = stepMap.get(1);
          introViewer.updateView(currentStep);
        }
      }

      // todo use isActivated
      while (true) {
        try {
          waitForEvent();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }

  });
  
  public static void initPopupShow(final Activity activity){
    IntroController.activity = activity;
  }
  
  private static void initPopupShow() {
    introViewer = new IntroViewer(activity, activity.getResources()
        .getString(R.string.intro_start_title), activity.getResources()
        .getString(R.string.intro_start_desc));

    graph = new TaskGraph();

    popup = new PopupWindow(introViewer, LayoutParams.MATCH_PARENT,
        LayoutParams.MATCH_PARENT);
    popup.setTouchable(false);
    popup.setFocusable(true);
    popup.setOutsideTouchable(true);
    popup.setTouchInterceptor(new OnTouchListener() {

      @Override
      public boolean onTouch(View v, MotionEvent event) {
        return false;
      }

    });

    activity.getWindow().getDecorView().post(new Runnable() {
      @Override
      public void run() {
        if(popup!=null)
        popup.showAtLocation(activity.getWindow().getDecorView()
            .getRootView(), Gravity.TOP, 0, 0);
      }
    });
  }

  public static void addViewToStep(int i, View view) {
    if (stepMap != null)
      synchronized (mutex) {
        stepMap.get(i).view = view;
      }
  }

  public static void notify(View view) {
    if (isActivated)
      synchronized (mutex) {
        viewIndicator = view;
        mutex.notifyAll();
      }
  }

  public static void notify(int rId) {
    if (isActivated)
      synchronized (mutex) {
        idIndicator = rId;
        mutex.notifyAll();
      }
  }
  
  public static void startIntro(boolean hasDataSources) {
    if(!started && !hasDataSources ){
      started = true;
      initPopupShow();
      return;
    }
    hasDataSources = false;
  }

  public static void skipIntro() {
    graph = null;
    currentStep = null;
    handler = null;
    stepMap = null;
    isActivated = false;
    introViewer.setVisibility(View.GONE);
    introViewer = null;
    popup.dismiss();
    popup = null;
  }

  public static void finishTaskIfActive(int i) {
    if (isActivated)
      synchronized (stepMap) {
        graph.checkCondition(i);
      }
  }

  private static void refreshPopup() {
    if (!isActivated)
      return;
    activity.getWindow().getDecorView().post(new Runnable() {
      @Override
      public void run() {
        popup.dismiss();
        popup.showAtLocation(activity.getWindow().getDecorView()
            .getRootView(), Gravity.TOP, 0, 0);
      }
    });
  }

}




Java Source Code List

.DataSourcesOverlay.java
.VisualizationOverlayItem.java
org.n52.geoar.AboutDialog.java
org.n52.geoar.DataSourceListAdapter.java
org.n52.geoar.GeoARActivity.java
org.n52.geoar.GeoARApplication.java
org.n52.geoar.ar.view.ARFragment.java
org.n52.geoar.ar.view.ARObject.java
org.n52.geoar.ar.view.ARView.java
org.n52.geoar.ar.view.DataSourceVisualizationHandler.java
org.n52.geoar.ar.view.IntroController.java
org.n52.geoar.ar.view.IntroViewer.java
org.n52.geoar.ar.view.gl.ARSurfaceViewRenderer.java
org.n52.geoar.ar.view.gl.ARSurfaceView.java
org.n52.geoar.ar.view.gl.GLESCamera.java
org.n52.geoar.ar.view.gl.MultisampleConfigs.java
org.n52.geoar.ar.view.gl.SurfaceTopology.java
org.n52.geoar.ar.view.overlay.ARCanvasSurfaceView.java
org.n52.geoar.ar.view.overlay.GUIDrawable.java
org.n52.geoar.ar.view.overlay.Radar.java
org.n52.geoar.exception.UnsupportedGeometryType.java
org.n52.geoar.map.view.DataSourceOverlayHandler.java
org.n52.geoar.map.view.GeoARMapView.java
org.n52.geoar.map.view.MapActivityContext.java
org.n52.geoar.map.view.MapFragment.java
org.n52.geoar.map.view.overlay.DataSourceOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePointOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePolygonOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePolylineOverlay.java
org.n52.geoar.map.view.overlay.DataSourcesOverlay.java
org.n52.geoar.map.view.overlay.OverlayType.java
org.n52.geoar.map.view.overlay.PointOverlayType.java
org.n52.geoar.map.view.overlay.PolygonOverlayType.java
org.n52.geoar.map.view.overlay.PolylineOverlayType.java
org.n52.geoar.newdata.CheckList.java
org.n52.geoar.newdata.DataCache.java
org.n52.geoar.newdata.DataSourceHolder.java
org.n52.geoar.newdata.DataSourceInstanceHolder.java
org.n52.geoar.newdata.DataSourceInstanceSettingsDialogActivity.java
org.n52.geoar.newdata.InstalledPluginHolder.java
org.n52.geoar.newdata.PluginActivityContext.java
org.n52.geoar.newdata.PluginContext.java
org.n52.geoar.newdata.PluginDialogFragment.java
org.n52.geoar.newdata.PluginDownloadHolder.java
org.n52.geoar.newdata.PluginDownloader.java
org.n52.geoar.newdata.PluginFragment.java
org.n52.geoar.newdata.PluginGridAdapter.java
org.n52.geoar.newdata.PluginHolder.java
org.n52.geoar.newdata.PluginLoader.java
org.n52.geoar.newdata.PluginLogger.java
org.n52.geoar.newdata.PluginStateInputStream.java
org.n52.geoar.newdata.Tile.java
org.n52.geoar.settings.DateTimeSettingsViewField.java
org.n52.geoar.settings.DateUtils.java
org.n52.geoar.settings.NumberSettingsViewField.java
org.n52.geoar.settings.SettingsException.java
org.n52.geoar.settings.SettingsHelper.java
org.n52.geoar.settings.SettingsViewField.java
org.n52.geoar.settings.SettingsView.java
org.n52.geoar.settings.SpinnerSettingsViewField.java
org.n52.geoar.settings.StringSettingsViewField.java
org.n52.geoar.tracking.camera.CameraView.java
org.n52.geoar.tracking.camera.RealityCamera.java
org.n52.geoar.tracking.location.AdaptiveLowPassSensorBuffer.java
org.n52.geoar.tracking.location.LocationHandler.java
org.n52.geoar.tracking.location.LowPassSensorBuffer.java
org.n52.geoar.tracking.location.MeanSensorBuffer.java
org.n52.geoar.tracking.location.SensorBuffer.java
org.n52.geoar.view.InfoView.java
org.n52.geoar.view.geoar.CalibrationControlView.java
org.n52.geoar.view.geoar.Settings.java
org.n52.geoar.view.geoar.gl.mode.BilligerColorShader.java
org.n52.geoar.view.geoar.gl.mode.BilligerLightShader.java
org.n52.geoar.view.geoar.gl.mode.BilligerTextureShader.java
org.n52.geoar.view.geoar.gl.mode.BoundingBox.java
org.n52.geoar.view.geoar.gl.mode.FeatureShader.java
org.n52.geoar.view.geoar.gl.mode.PhongFeatureShader.java
org.n52.geoar.view.geoar.gl.mode.RenderFeature2.java
org.n52.geoar.view.geoar.gl.mode.Spatial.java
org.n52.geoar.view.geoar.gl.mode.TextureFeatureShader.java
org.n52.geoar.view.geoar.gl.mode.Texture.java
org.n52.geoar.view.geoar.gl.mode.features.CubeFeature2.java
org.n52.geoar.view.geoar.gl.mode.features.FlatCircleFeature.java
org.n52.geoar.view.geoar.gl.mode.features.HeightMapFeature.java
org.n52.geoar.view.geoar.gl.mode.features.NewGridFeature.java
org.n52.geoar.view.geoar.gl.mode.features.ReferencedGridFeature.java
org.n52.geoar.view.geoar.gl.mode.features.SphereFeature.java
org.n52.geoar.view.geoar.gl.mode.features.TriangleFeature.java