AccelPlugin.java :  » File » jswaffle » com » kujirahand » jsWaffle » plugins » Android Open Source

Android Open Source » File » jswaffle 
jswaffle » com » kujirahand » jsWaffle » plugins » AccelPlugin.java
package com.kujirahand.jsWaffle.plugins;

import java.util.List;
import java.util.Vector;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.SystemClock;

import com.kujirahand.jsWaffle.WaffleActivity;
import com.kujirahand.jsWaffle.model.WafflePlugin;

public class AccelPlugin extends WafflePlugin {

  Vector<AccelListener> listeners = new Vector<AccelListener>();
  
  // javascript interfalce
  /**
   * Set Sensor event callback
   * @param funcname
   * @param requestCode
   */
  public int setAccelCallback(String funcname, int requestCode) {
    AccelListener ac = new AccelListener(waffle_activity);
    listeners.add(ac);
    ac.sensour_callback_funcname = funcname;
    ac.requestCode = requestCode;
    ac.start();
    return listeners.size();
  }
  
  public void clearAccelAll() {
    for (int i = 0; i < listeners.size(); i++) {
      clearAccel(i + 1);
    }
  }
  
  public void clearAccel(int watchId) {
    int index = watchId - 1;
    if (listeners.size() <= 0) return;
    if (!(0 <= index && index < listeners.size())) {
      return;
    }
    AccelListener ac = listeners.get(index);
    if (ac == null) return;
    if (ac.isLive) {
      try {
        ac.stop();
      } 
      catch (Exception e) {
        waffle_activity.log_error("[Accel Error] clearAccel Error");
      }
    }
    listeners.set(index, null);
  }
  
  /**
   * Set Shake Event callback
   */
  public void setShakeCallback(String shake_callback_fn, String shake_end_callback_fn, double shake_freq, double shake_end_freq, int requestCode) {
    AccelListener ac = new AccelListener(waffle_activity);
    listeners.add(ac);
    // shake
    ac.shake_callback_funcname = shake_callback_fn;
    ac.shake_freq = shake_freq;
    // shake end
    ac.shake_end_callback_funcname = shake_end_callback_fn;
    ac.shake_end_freq = shake_end_freq;
    //
    ac.requestCode = requestCode;
    ac.start();
  }
  
  public void onPause() {
    for (AccelListener ac : listeners) {
      if (ac != null) {
        ac.stop();
      }
    }
  }
  
  public void onResume() {
    for (AccelListener ac : listeners) {
      if (ac != null) {
        ac.start();
      }
    }
  }
  
  public void onPageStarted() {
    clearAccelAll();
    listeners.clear();
  }
  
  public void onDestroy() {
    clearAccelAll();
    listeners.clear();
  }
}

class AccelListener implements SensorEventListener
{
  SensorManager sensorMan;
  WaffleActivity context;
  public Boolean isLive = false;
  
  public static final int SHAKE_STATUS_READY = 0;
  public static final int SHAKE_STATUS_SHAKING = 1;
  
  public int requestCode;
  public String sensour_callback_funcname = null;
  public String shake_callback_funcname = null;
  public String shake_end_callback_funcname = null;
  public double shake_freq = 20.0f;
  public double shake_end_freq = 8.0f;
  public int shake_status = SHAKE_STATUS_READY;
  
  public AccelListener(WaffleActivity context) {
    this.context = context;
    sensorMan = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
  }
  
  public void start() {
    List<Sensor> sensors = sensorMan.getSensorList(Sensor.TYPE_ACCELEROMETER);
    if (sensors.size() > 0) {
      Sensor se = sensors.get(0);
      isLive = sensorMan.registerListener(this, se, SensorManager.SENSOR_DELAY_GAME);
    }
    shake_status = SHAKE_STATUS_READY;
  }
  
  public void stop() {
    if (isLive) {
      sensorMan.unregisterListener(this);
      isLive = false;
    }
  }
  
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }

  private long lastTime = 0;
    private float[] currentOrientationValues = {0.0f, 0.0f, 0.0f};
    private float[] currentAccelerationValues = {0.0f, 0.0f, 0.0f};

  @Override
  public void onSensorChanged(SensorEvent event) {
      float accelX = event.values[0];
      float accelY = event.values[1];
      float accelZ = event.values[2];
        switch(event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            // 
            currentOrientationValues[0] = event.values[0] * 0.1f + currentOrientationValues[0] * (1.0f - 0.1f);
            currentOrientationValues[1] = event.values[1] * 0.1f + currentOrientationValues[1] * (1.0f - 0.1f);
            currentOrientationValues[2] = event.values[2] * 0.1f + currentOrientationValues[2] * (1.0f - 0.1f);
            // 
            currentAccelerationValues[0] = event.values[0] - currentOrientationValues[0];
            currentAccelerationValues[1] = event.values[1] - currentOrientationValues[1];
            currentAccelerationValues[2] = event.values[2] - currentOrientationValues[2];
            
            // 
            float targetValue = 
                Math.abs(currentAccelerationValues[0]) + 
                Math.abs(currentAccelerationValues[1]) +
                Math.abs(currentAccelerationValues[2]);
            if(targetValue > shake_freq) {
              /*
              currentOrientationValues[0] = 0;
              currentOrientationValues[1] = 0;
              currentOrientationValues[2] = 0;
              currentAccelerationValues[0] = 0;
              currentAccelerationValues[1] = 0;
              currentAccelerationValues[2] = 0;
              */
              //
              if (shake_status == SHAKE_STATUS_READY) {
                if (shake_callback_funcname != null) {
                  context.callJsEvent(shake_callback_funcname + "(" + requestCode + ")");
                  shake_status = SHAKE_STATUS_SHAKING;
                }
              }
            }
            else if(targetValue < shake_end_freq) {
              // 
              if (shake_status == SHAKE_STATUS_SHAKING) {
                if (shake_end_callback_funcname != null) {
                  context.callJsEvent(shake_end_callback_funcname + "(" + requestCode + ")");
                  shake_status = SHAKE_STATUS_READY;
                }
              }
            }
            /*
            // 
            if(Math.abs(currentOrientationValues[0]) > 7.0f) {
                //orientation.setText("");
            } else if(Math.abs(currentOrientationValues[1]) > 7.0f) {
                //orientation.setText("");
            } else if(Math.abs(currentOrientationValues[2]) > 7.0f) {
                //orientation.setText("");
            } else {
                //orientation.setText("");
            }
            */
            break;
        default:
        }
        // send event
        if (sensour_callback_funcname == null || sensour_callback_funcname == "") return;
        long now = SystemClock.uptimeMillis();
        long diff = now - lastTime;
        if (diff > 100) {
      String accel_str = sensour_callback_funcname + 
        "(" + accelX + "," + accelY + "," + accelZ + "," + requestCode + ")";
      context.callJsEvent(accel_str);
      lastTime = now;
        }
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.