public void onSensorChanged(SensorEvent event) {
    long currentTime = System.currentTimeMillis();
    long diffTime = currentTime - mLastUpdateTime;
    if (diffTime > UPDATE_INTERVAL) {
      if (mLastUpdateTime != 0) {
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        float deltaX = x - mLastX;
        float deltaY = y - mLastY;
        float deltaZ = z - mLastZ;
        float delta =
            FloatMath.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / diffTime * 10000;
        if (delta > SHAKE_THRESHOLD) {
          if (!shaken) {
            shaken = true;
            finish();
          }

          if (listener != null) {
            listener.onShake();
          }
        }
        mLastX = x;
        mLastY = y;
        mLastZ = z;
      }
      mLastUpdateTime = currentTime;
    }
  }