| Index: content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java | 
| diff --git a/content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java b/content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java | 
| deleted file mode 100644 | 
| index a77cd28b27ab6901f6a12f7a2e4e012b3e7c8f71..0000000000000000000000000000000000000000 | 
| --- a/content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java | 
| +++ /dev/null | 
| @@ -1,269 +0,0 @@ | 
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -package org.chromium.content.browser; | 
| - | 
| -import android.content.Context; | 
| -import android.hardware.Sensor; | 
| -import android.hardware.SensorEvent; | 
| -import android.hardware.SensorEventListener; | 
| -import android.hardware.SensorManager; | 
| -import android.os.Handler; | 
| -import android.os.Looper; | 
| - | 
| -import org.chromium.base.CalledByNative; | 
| -import org.chromium.base.JNINamespace; | 
| -import org.chromium.base.WeakContext; | 
| - | 
| -import java.util.List; | 
| - | 
| -/** | 
| - * Android implementation of the DeviceOrientation API. | 
| - */ | 
| -@JNINamespace("content") | 
| -class DeviceOrientation implements SensorEventListener { | 
| - | 
| -    // These fields are lazily initialized by getHandler(). | 
| -    private Thread mThread; | 
| -    private Handler mHandler; | 
| - | 
| -    // The lock to access the mHandler. | 
| -    private Object mHandlerLock = new Object(); | 
| - | 
| -    // Non-zero if and only if we're listening for events. | 
| -    // To avoid race conditions on the C++ side, access must be synchronized. | 
| -    private int mNativePtr; | 
| - | 
| -    // The lock to access the mNativePtr. | 
| -    private Object mNativePtrLock = new Object(); | 
| - | 
| -    // The gravity vector expressed in the body frame. | 
| -    private float[] mGravityVector; | 
| - | 
| -    // The geomagnetic vector expressed in the body frame. | 
| -    private float[] mMagneticFieldVector; | 
| - | 
| -    // Lazily initialized when registering for notifications. | 
| -    private SensorManager mSensorManager; | 
| - | 
| -    // The only instance of that class and its associated lock. | 
| -    private static DeviceOrientation sSingleton; | 
| -    private static Object sSingletonLock = new Object(); | 
| - | 
| -    private DeviceOrientation() { | 
| -    } | 
| - | 
| -    /** | 
| -     * Start listening for sensor events. If this object is already listening | 
| -     * for events, the old callback is unregistered first. | 
| -     * | 
| -     * @param nativePtr Value to pass to nativeGotOrientation() for each event. | 
| -     * @param rateInMilliseconds Requested callback rate in milliseconds. The | 
| -     *            actual rate may be higher. Unwanted events should be ignored. | 
| -     * @return True on success. | 
| -     */ | 
| -    @CalledByNative | 
| -    public boolean start(int nativePtr, int rateInMilliseconds) { | 
| -        synchronized (mNativePtrLock) { | 
| -            stop(); | 
| -            if (registerForSensors(rateInMilliseconds)) { | 
| -                mNativePtr = nativePtr; | 
| -                return true; | 
| -            } | 
| -            return false; | 
| -        } | 
| -    } | 
| - | 
| -    /** | 
| -     * Stop listening for sensor events. Always succeeds. | 
| -     * | 
| -     * We strictly guarantee that nativeGotOrientation() will not be called | 
| -     * after this method returns. | 
| -     */ | 
| -    @CalledByNative | 
| -    public void stop() { | 
| -        synchronized (mNativePtrLock) { | 
| -            if (mNativePtr != 0) { | 
| -                mNativePtr = 0; | 
| -                unregisterForSensors(); | 
| -            } | 
| -        } | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onAccuracyChanged(Sensor sensor, int accuracy) { | 
| -        // Nothing | 
| -    } | 
| - | 
| -    @Override | 
| -    public void onSensorChanged(SensorEvent event) { | 
| -        switch (event.sensor.getType()) { | 
| -            case Sensor.TYPE_ACCELEROMETER: | 
| -                if (mGravityVector == null) { | 
| -                    mGravityVector = new float[3]; | 
| -                } | 
| -                System.arraycopy(event.values, 0, mGravityVector, 0, mGravityVector.length); | 
| -                break; | 
| - | 
| -            case Sensor.TYPE_MAGNETIC_FIELD: | 
| -                if (mMagneticFieldVector == null) { | 
| -                    mMagneticFieldVector = new float[3]; | 
| -                } | 
| -                System.arraycopy(event.values, 0, mMagneticFieldVector, 0, | 
| -                                 mMagneticFieldVector.length); | 
| -                break; | 
| - | 
| -            default: | 
| -                // Unexpected | 
| -                return; | 
| -        } | 
| - | 
| -        getOrientationUsingGetRotationMatrix(); | 
| -    } | 
| - | 
| -    void getOrientationUsingGetRotationMatrix() { | 
| -        if (mGravityVector == null || mMagneticFieldVector == null) { | 
| -            return; | 
| -        } | 
| - | 
| -        // Get the rotation matrix. | 
| -        // The rotation matrix that transforms from the body frame to the earth | 
| -        // frame. | 
| -        float[] deviceRotationMatrix = new float[9]; | 
| -        if (!SensorManager.getRotationMatrix(deviceRotationMatrix, null, mGravityVector, | 
| -                mMagneticFieldVector)) { | 
| -            return; | 
| -        } | 
| - | 
| -        // Convert rotation matrix to rotation angles. | 
| -        // Assuming that the rotations are appied in the order listed at | 
| -        // http://developer.android.com/reference/android/hardware/SensorEvent.html#values | 
| -        // the rotations are applied about the same axes and in the same order as required by the | 
| -        // API. The only conversions are sign changes as follows.  The angles are in radians | 
| - | 
| -        float[] rotationAngles = new float[3]; | 
| -        SensorManager.getOrientation(deviceRotationMatrix, rotationAngles); | 
| - | 
| -        double alpha = Math.toDegrees(-rotationAngles[0]); | 
| -        while (alpha < 0.0) { | 
| -            alpha += 360.0; // [0, 360) | 
| -        } | 
| - | 
| -        double beta = Math.toDegrees(-rotationAngles[1]); | 
| -        while (beta < -180.0) { | 
| -            beta += 360.0; // [-180, 180) | 
| -        } | 
| - | 
| -        double gamma = Math.toDegrees(rotationAngles[2]); | 
| -        while (gamma < -90.0) { | 
| -            gamma += 360.0; // [-90, 90) | 
| -        } | 
| - | 
| -        gotOrientation(alpha, beta, gamma); | 
| -    } | 
| - | 
| -    boolean registerForSensors(int rateInMilliseconds) { | 
| -        if (registerForSensorType(Sensor.TYPE_ACCELEROMETER, rateInMilliseconds) | 
| -                && registerForSensorType(Sensor.TYPE_MAGNETIC_FIELD, rateInMilliseconds)) { | 
| -            return true; | 
| -        } | 
| -        unregisterForSensors(); | 
| -        return false; | 
| -    } | 
| - | 
| -    private SensorManager getSensorManager() { | 
| -        if (mSensorManager != null) { | 
| -            return mSensorManager; | 
| -        } | 
| -        mSensorManager = (SensorManager)WeakContext.getSystemService(Context.SENSOR_SERVICE); | 
| -        return mSensorManager; | 
| -    } | 
| - | 
| -    void unregisterForSensors() { | 
| -        SensorManager sensorManager = getSensorManager(); | 
| -        if (sensorManager == null) { | 
| -            return; | 
| -        } | 
| -        sensorManager.unregisterListener(this); | 
| -    } | 
| - | 
| -    boolean registerForSensorType(int type, int rateInMilliseconds) { | 
| -        SensorManager sensorManager = getSensorManager(); | 
| -        if (sensorManager == null) { | 
| -            return false; | 
| -        } | 
| -        List<Sensor> sensors = sensorManager.getSensorList(type); | 
| -        if (sensors.isEmpty()) { | 
| -            return false; | 
| -        } | 
| - | 
| -        final int rateInMicroseconds = 1000 * rateInMilliseconds; | 
| -        // We want to err on the side of getting more events than we need. | 
| -        final int requestedRate = rateInMicroseconds / 2; | 
| - | 
| -        // TODO(steveblock): Consider handling multiple sensors. | 
| -        return sensorManager.registerListener(this, sensors.get(0), requestedRate, getHandler()); | 
| -    } | 
| - | 
| -    void gotOrientation(double alpha, double beta, double gamma) { | 
| -        synchronized (mNativePtrLock) { | 
| -            if (mNativePtr != 0) { | 
| -              nativeGotOrientation(mNativePtr, alpha, beta, gamma); | 
| -            } | 
| -        } | 
| -    } | 
| - | 
| -    private Handler getHandler() { | 
| -        synchronized (mHandlerLock) { | 
| -            // If we don't have a background thread, start it now. | 
| -            if (mThread == null) { | 
| -                mThread = new Thread(new Runnable() { | 
| -                    @Override | 
| -                    public void run() { | 
| -                        Looper.prepare(); | 
| -                        // Our Handler doesn't actually have to do anything, because | 
| -                        // SensorManager posts directly to the underlying Looper. | 
| -                        setHandler(new Handler()); | 
| -                        Looper.loop(); | 
| -                    } | 
| -                }); | 
| -                mThread.start(); | 
| -            } | 
| -            // Wait for the background thread to spin up. | 
| -            while (mHandler == null) { | 
| -                try { | 
| -                    mHandlerLock.wait(); | 
| -                } catch (InterruptedException e) { | 
| -                    // Somebody doesn't want us to wait! That's okay, SensorManager accepts null. | 
| -                    return null; | 
| -                } | 
| -            } | 
| -            return mHandler; | 
| -        } | 
| -    } | 
| - | 
| -    private void setHandler(Handler handler) { | 
| -        synchronized (mHandlerLock) { | 
| -            mHandler = handler; | 
| -            mHandlerLock.notify(); | 
| -        } | 
| -    } | 
| - | 
| -    @CalledByNative | 
| -    private static DeviceOrientation getInstance() { | 
| -        synchronized (sSingletonLock) { | 
| -            if (sSingleton == null) { | 
| -                sSingleton = new DeviceOrientation(); | 
| -            } | 
| -            return sSingleton; | 
| -        } | 
| -    } | 
| - | 
| -    /** | 
| -     * See chrome/browser/device_orientation/data_fetcher_impl_android.cc | 
| -     */ | 
| -    private native void nativeGotOrientation( | 
| -            int nativeDataFetcherImplAndroid, | 
| -            double alpha, double beta, double gamma); | 
| -} | 
|  |