| Index: device/geolocation/android/java/org/chromium/device/geolocation/LocationProviderFactory.java
 | 
| diff --git a/device/geolocation/android/java/org/chromium/device/geolocation/LocationProviderFactory.java b/device/geolocation/android/java/org/chromium/device/geolocation/LocationProviderFactory.java
 | 
| deleted file mode 100644
 | 
| index 409b57f1ebfae3380c271cf5adc81a3ce201ef94..0000000000000000000000000000000000000000
 | 
| --- a/device/geolocation/android/java/org/chromium/device/geolocation/LocationProviderFactory.java
 | 
| +++ /dev/null
 | 
| @@ -1,212 +0,0 @@
 | 
| -// Copyright 2013 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.device.geolocation;
 | 
| -
 | 
| -import android.content.Context;
 | 
| -import android.location.Criteria;
 | 
| -import android.location.Location;
 | 
| -import android.location.LocationListener;
 | 
| -import android.location.LocationManager;
 | 
| -import android.os.Bundle;
 | 
| -
 | 
| -import org.chromium.base.Log;
 | 
| -import org.chromium.base.ThreadUtils;
 | 
| -import org.chromium.base.VisibleForTesting;
 | 
| -
 | 
| -import java.util.List;
 | 
| -
 | 
| -/**
 | 
| - * Factory to create a LocationProvider to allow us to inject
 | 
| - * a mock for tests.
 | 
| - */
 | 
| -public class LocationProviderFactory {
 | 
| -    private static LocationProviderFactory.LocationProvider sProviderImpl;
 | 
| -
 | 
| -    /**
 | 
| -     * LocationProviderFactory.get() returns an instance of this interface.
 | 
| -     */
 | 
| -    public interface LocationProvider {
 | 
| -        public void start(boolean enableHighAccuracy);
 | 
| -        public void stop();
 | 
| -        public boolean isRunning();
 | 
| -    }
 | 
| -
 | 
| -    private LocationProviderFactory() {
 | 
| -    }
 | 
| -
 | 
| -    @VisibleForTesting
 | 
| -    public static void setLocationProviderImpl(LocationProviderFactory.LocationProvider provider) {
 | 
| -        assert sProviderImpl == null;
 | 
| -        sProviderImpl = provider;
 | 
| -    }
 | 
| -
 | 
| -    public static LocationProvider get(Context context) {
 | 
| -        if (sProviderImpl == null) {
 | 
| -            sProviderImpl = new LocationProviderImpl(context);
 | 
| -        }
 | 
| -        return sProviderImpl;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * This is the core of android location provider. It is a separate class for clarity
 | 
| -     * so that it can manage all processing completely in the UI thread. The container class
 | 
| -     * ensures that the start/stop calls into this class are done in the UI thread.
 | 
| -     */
 | 
| -    private static class LocationProviderImpl
 | 
| -            implements LocationListener, LocationProviderFactory.LocationProvider {
 | 
| -
 | 
| -        // Log tag
 | 
| -        private static final String TAG = "cr_LocationProvider";
 | 
| -
 | 
| -        private Context mContext;
 | 
| -        private LocationManager mLocationManager;
 | 
| -        private boolean mIsRunning;
 | 
| -
 | 
| -        LocationProviderImpl(Context context) {
 | 
| -            mContext = context;
 | 
| -        }
 | 
| -
 | 
| -        /**
 | 
| -         * Start listening for location updates.
 | 
| -         * @param enableHighAccuracy Whether or not to enable high accuracy location providers.
 | 
| -         */
 | 
| -        @Override
 | 
| -        public void start(boolean enableHighAccuracy) {
 | 
| -            unregisterFromLocationUpdates();
 | 
| -            registerForLocationUpdates(enableHighAccuracy);
 | 
| -        }
 | 
| -
 | 
| -        /**
 | 
| -         * Stop listening for location updates.
 | 
| -         */
 | 
| -        @Override
 | 
| -        public void stop() {
 | 
| -            unregisterFromLocationUpdates();
 | 
| -        }
 | 
| -
 | 
| -        /**
 | 
| -         * Returns true if we are currently listening for location updates, false if not.
 | 
| -         */
 | 
| -        @Override
 | 
| -        public boolean isRunning() {
 | 
| -            return mIsRunning;
 | 
| -        }
 | 
| -
 | 
| -        @Override
 | 
| -        public void onLocationChanged(Location location) {
 | 
| -            // Callbacks from the system location service are queued to this thread, so it's
 | 
| -            // possible that we receive callbacks after unregistering. At this point, the
 | 
| -            // native object will no longer exist.
 | 
| -            if (mIsRunning) {
 | 
| -                updateNewLocation(location);
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -        private void updateNewLocation(Location location) {
 | 
| -            LocationProviderAdapter.newLocationAvailable(
 | 
| -                    location.getLatitude(), location.getLongitude(),
 | 
| -                    location.getTime() / 1000.0,
 | 
| -                    location.hasAltitude(), location.getAltitude(),
 | 
| -                    location.hasAccuracy(), location.getAccuracy(),
 | 
| -                    location.hasBearing(), location.getBearing(),
 | 
| -                    location.hasSpeed(), location.getSpeed());
 | 
| -        }
 | 
| -
 | 
| -        @Override
 | 
| -        public void onStatusChanged(String provider, int status, Bundle extras) {
 | 
| -        }
 | 
| -
 | 
| -        @Override
 | 
| -        public void onProviderEnabled(String provider) {
 | 
| -        }
 | 
| -
 | 
| -        @Override
 | 
| -        public void onProviderDisabled(String provider) {
 | 
| -        }
 | 
| -
 | 
| -        private void ensureLocationManagerCreated() {
 | 
| -            if (mLocationManager != null) return;
 | 
| -            mLocationManager = (LocationManager) mContext.getSystemService(
 | 
| -                    Context.LOCATION_SERVICE);
 | 
| -            if (mLocationManager == null) {
 | 
| -                Log.e(TAG, "Could not get location manager.");
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -        /**
 | 
| -         * Registers this object with the location service.
 | 
| -         */
 | 
| -        private void registerForLocationUpdates(boolean enableHighAccuracy) {
 | 
| -            ensureLocationManagerCreated();
 | 
| -            if (usePassiveOneShotLocation()) return;
 | 
| -
 | 
| -            assert !mIsRunning;
 | 
| -            mIsRunning = true;
 | 
| -
 | 
| -            // We're running on the main thread. The C++ side is responsible to
 | 
| -            // bounce notifications to the Geolocation thread as they arrive in the mainLooper.
 | 
| -            try {
 | 
| -                Criteria criteria = new Criteria();
 | 
| -                if (enableHighAccuracy) criteria.setAccuracy(Criteria.ACCURACY_FINE);
 | 
| -                mLocationManager.requestLocationUpdates(0, 0, criteria, this,
 | 
| -                        ThreadUtils.getUiThreadLooper());
 | 
| -            } catch (SecurityException e) {
 | 
| -                Log.e(TAG, "Caught security exception while registering for location updates "
 | 
| -                        + "from the system. The application does not have sufficient geolocation "
 | 
| -                        + "permissions.");
 | 
| -                unregisterFromLocationUpdates();
 | 
| -                // Propagate an error to JavaScript, this can happen in case of WebView
 | 
| -                // when the embedding app does not have sufficient permissions.
 | 
| -                LocationProviderAdapter.newErrorAvailable("application does not have sufficient "
 | 
| -                        + "geolocation permissions.");
 | 
| -            } catch (IllegalArgumentException e) {
 | 
| -                Log.e(TAG, "Caught IllegalArgumentException registering for location updates.");
 | 
| -                unregisterFromLocationUpdates();
 | 
| -                assert false;
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -        /**
 | 
| -         * Unregisters this object from the location service.
 | 
| -         */
 | 
| -        private void unregisterFromLocationUpdates() {
 | 
| -            if (mIsRunning) {
 | 
| -                mIsRunning = false;
 | 
| -                mLocationManager.removeUpdates(this);
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -        private boolean usePassiveOneShotLocation() {
 | 
| -            if (!isOnlyPassiveLocationProviderEnabled()) return false;
 | 
| -
 | 
| -            // Do not request a location update if the only available location provider is
 | 
| -            // the passive one. Make use of the last known location and call
 | 
| -            // onLocationChanged directly.
 | 
| -            final Location location = mLocationManager.getLastKnownLocation(
 | 
| -                    LocationManager.PASSIVE_PROVIDER);
 | 
| -            if (location != null) {
 | 
| -                ThreadUtils.runOnUiThread(new Runnable() {
 | 
| -                    @Override
 | 
| -                    public void run() {
 | 
| -                        updateNewLocation(location);
 | 
| -                    }
 | 
| -                });
 | 
| -            }
 | 
| -            return true;
 | 
| -        }
 | 
| -
 | 
| -        /*
 | 
| -         * Checks if the passive location provider is the only provider available
 | 
| -         * in the system.
 | 
| -         */
 | 
| -        private boolean isOnlyPassiveLocationProviderEnabled() {
 | 
| -            List<String> providers = mLocationManager.getProviders(true);
 | 
| -            return providers != null && providers.size() == 1
 | 
| -                    && providers.get(0).equals(LocationManager.PASSIVE_PROVIDER);
 | 
| -        }
 | 
| -    }
 | 
| -}
 | 
| -
 | 
| -
 | 
| 
 |