private void removeObjects() {
   Body body = w.getWorld().getBodyList();
   while (body != null) {
     Body current = body;
     body = body.m_next;
     if (current.m_userData != null) {
       w.getWorld().destroyBody(current);
     }
   }
 }
  /** When the activity is created this method is called and will set everything up. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get an instance of the SensorManager
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    // Get an instance of the PowerManager
    mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);

    // Get an instance of the WindowManager
    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    mDisplay = mWindowManager.getDefaultDisplay();

    // Create a bright wake lock
    mWakeLock =
        mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());

    getWindow()
        .setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

    // set up the physics world
    pWorld = new PhysicsWorld(this, dm.widthPixels, dm.heightPixels);
    this.setContentView(this.pWorld);
    pWorld.setOnTouchListener(this);

    // get a clientID and then generate paint based upon it
    registerOnServer();
    pWorld.setPaint();

    // Add some initial balls
    for (int i = 0; i < 2; i++) {
      pWorld.addToCreateList();
    }

    // Start Regular Update
    mHandler = new Handler();
    mHandler.post(update);

    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);

    networkThread();
  }
  /**
   * Register the client on the server to obtain a client id which is then used to determine the
   * colour of the client's world/balls
   */
  public void registerOnServer() {

    try {

      httppost.setURI(new URI(url + "/register?w=" + pWorld.World_W + "&h=" + pWorld.World_H));
      HttpResponse response = httpclient.execute(httppost);
      BufferedReader reader =
          new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
      String input = reader.readLine();

      if (!input.equals(null)) {
        clientID = Integer.parseInt(input);
        pWorld.clientID = this.clientID;
      } else Log.e(TAG, "invalid reponse from server");

      Log.d(TAG, "******clientID: " + clientID);

    } catch (UnsupportedEncodingException e) {
      Log.e(TAG, e.getMessage());
      // e.printStackTrace();
    } catch (URISyntaxException e) {
      Log.e(TAG, e.getMessage());
    } catch (ClientProtocolException e) {
      Log.e(TAG, e.getMessage());
    } catch (IOException e) {
      Log.e(TAG, e.getMessage());
    }
  }
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
     case R.id.item_clear:
       removeObjects();
       return true;
     case R.id.item_rotate:
       rotateScreen();
       return true;
     case R.id.item_gravity_normal:
       {
         SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
         sensorManager.unregisterListener(listener);
         w.getWorld().setGravity(new Vec2(0.0f, -10.0f));
         saveGravity(GRAVITY_NORMAL);
         return true;
       }
     case R.id.item_gravity_moon:
       {
         SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
         sensorManager.unregisterListener(listener);
         w.getWorld().setGravity(new Vec2(0.0f, -1.67f));
         saveGravity(GRAVITY_MOON);
         return true;
       }
     case R.id.item_gravity_zero:
       {
         SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
         sensorManager.unregisterListener(listener);
         w.getWorld().setGravity(new Vec2(0.0f, 0.0f));
         saveGravity(GRAVITY_ZERO);
         return true;
       }
     case R.id.item_gravity_accelerometer:
       SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
       Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
       if (sensor != null) {
         sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
       }
       saveGravity(GRAVITY_ACCELEROMETER);
       return true;
     default:
       return super.onOptionsItemSelected(item);
   }
 }
 /** When a person touches the screen, a ball will be created at that same location */
 @Override
 public boolean onTouch(View v, MotionEvent e) {
   float x = e.getX();
   float y = e.getY();
   switch (e.getActionMasked()) {
     case MotionEvent.ACTION_DOWN:
       pWorld.addBall(x, pWorld.World_H - y, 0, 0, pWorld.clientID);
       break;
   }
   return true;
 }
 public void onSensorChanged(SensorEvent event) {
   float x, y;
   if (rotation == Surface.ROTATION_0) {
     x = -event.values[SensorManager.DATA_X];
     y = -event.values[SensorManager.DATA_Y];
   } else if (rotation == Surface.ROTATION_90) {
     x = event.values[SensorManager.DATA_Y];
     y = -event.values[SensorManager.DATA_X];
   } else if (rotation == Surface.ROTATION_180) {
     x = event.values[SensorManager.DATA_X];
     y = event.values[SensorManager.DATA_Y];
   } else {
     x = -event.values[SensorManager.DATA_Y];
     y = event.values[SensorManager.DATA_X];
   }
   // Log.v("gravity", "x,y: " + x + " " + y);
   w.getWorld().setGravity(new Vec2(x, y));
 }
  @Override
  public void init(PhysicsWorld pw) {
    super.init(pw);
    int y = pw.World_H;
    int x = pw.World_W;

    pw.setball(160 * x / 320, 180 * y / 480);
    pw.addrope(20 * x / 320, 10 * y / 480);
    pw.addrope(-20 * x / 320, 10 * y / 480);
    // pw.addbubble(40, 250);
    // pw.addrope(10*x,(-25)*y);
    pw.addstar(160 * x / 320, 60 * y / 480);
    pw.addstar(160 * x / 320, 280 * y / 480);
    pw.addstar(160 * x / 320, 360 * y / 480);
    pw.addbubble(160 * x / 320, 280 * y / 480);
    pw.adddoor(160 * x / 320, 440 * y / 480);
  }
  /**
   * When the accelerometer notices a change this method gets triggered and will get the new
   * acceleration and then apply it to the physics world
   */
  @Override
  public void onSensorChanged(SensorEvent event) {
    float mSensorX = 0, mSensorY = 0;

    if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return;

    switch (mDisplay.getRotation()) {
      case Surface.ROTATION_0:
        mSensorX = event.values[0];
        mSensorY = event.values[1];
        break;
      case Surface.ROTATION_90:
        mSensorX = -event.values[1];
        mSensorY = event.values[0];
        break;
      case Surface.ROTATION_180:
        mSensorX = -event.values[0];
        mSensorY = -event.values[1];
        break;
      case Surface.ROTATION_270:
        mSensorX = event.values[1];
        mSensorY = -event.values[0];
        break;
    }

    /*
     * If the gravity change is greater than the threshold
     * then we will update the gravity in the physics world
     */
    Vec2 gravity_new = new Vec2(-mSensorX, -mSensorY);
    if (Math.abs(gravity_new.x - gravity.x) > gravity_threshold.x
        || Math.abs(gravity_new.y - gravity.y) > gravity_threshold.y) {
      gravity = gravity_new;
      pWorld.updateGravity(gravity);
    }
  } // end onSensorChange
 public void run() {
   pWorld.update();
   mHandler.postDelayed(update, (long) (10 / pWorld.timeStep));
 }