Search in sources :

Example 76 with Location

use of android.location.Location in project android_frameworks_base by ResurrectionRemix.

the class LocationManagerService method getLastLocation.

@Override
public Location getLastLocation(LocationRequest request, String packageName) {
    if (D)
        Log.d(TAG, "getLastLocation: " + request);
    if (request == null)
        request = DEFAULT_LOCATION_REQUEST;
    int allowedResolutionLevel = getCallerAllowedResolutionLevel();
    checkPackageName(packageName);
    checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel, request.getProvider());
    // no need to sanitize this request, as only the provider name is used
    final int pid = Binder.getCallingPid();
    final int uid = Binder.getCallingUid();
    final long identity = Binder.clearCallingIdentity();
    try {
        if (mBlacklist.isBlacklisted(packageName)) {
            if (D)
                Log.d(TAG, "not returning last loc for blacklisted app: " + packageName);
            return null;
        }
        if (!reportLocationAccessNoThrow(pid, uid, packageName, allowedResolutionLevel)) {
            if (D)
                Log.d(TAG, "not returning last loc for no op app: " + packageName);
            return null;
        }
        synchronized (mLock) {
            // Figure out the provider. Either its explicitly request (deprecated API's),
            // or use the fused provider
            String name = request.getProvider();
            if (name == null)
                name = LocationManager.FUSED_PROVIDER;
            LocationProviderInterface provider = mProvidersByName.get(name);
            if (provider == null)
                return null;
            if (!isAllowedByUserSettingsLocked(name, uid))
                return null;
            Location location;
            if (allowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
                // Make sure that an app with coarse permissions can't get frequent location
                // updates by calling LocationManager.getLastKnownLocation repeatedly.
                location = mLastLocationCoarseInterval.get(name);
            } else {
                location = mLastLocation.get(name);
            }
            if (location == null) {
                return null;
            }
            if (allowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
                Location noGPSLocation = location.getExtraLocation(Location.EXTRA_NO_GPS_LOCATION);
                if (noGPSLocation != null) {
                    return new Location(mLocationFudger.getOrCreate(noGPSLocation));
                }
            } else {
                return new Location(location);
            }
        }
        return null;
    } finally {
        Binder.restoreCallingIdentity(identity);
    }
}
Also used : LocationProviderInterface(com.android.server.location.LocationProviderInterface) Location(android.location.Location)

Example 77 with Location

use of android.location.Location in project android_frameworks_base by ResurrectionRemix.

the class LocationManagerService method handleLocationChangedLocked.

private void handleLocationChangedLocked(Location location, boolean passive) {
    if (D)
        Log.d(TAG, "incoming location: " + location);
    long now = SystemClock.elapsedRealtime();
    String provider = (passive ? LocationManager.PASSIVE_PROVIDER : location.getProvider());
    // Skip if the provider is unknown.
    LocationProviderInterface p = mProvidersByName.get(provider);
    if (p == null)
        return;
    // Update last known locations
    Location noGPSLocation = location.getExtraLocation(Location.EXTRA_NO_GPS_LOCATION);
    Location lastNoGPSLocation = null;
    Location lastLocation = mLastLocation.get(provider);
    if (lastLocation == null) {
        lastLocation = new Location(provider);
        mLastLocation.put(provider, lastLocation);
    } else {
        lastNoGPSLocation = lastLocation.getExtraLocation(Location.EXTRA_NO_GPS_LOCATION);
        if (noGPSLocation == null && lastNoGPSLocation != null) {
            // New location has no no-GPS location: adopt last no-GPS location. This is set
            // directly into location because we do not want to notify COARSE clients.
            location.setExtraLocation(Location.EXTRA_NO_GPS_LOCATION, lastNoGPSLocation);
        }
    }
    lastLocation.set(location);
    // Update last known coarse interval location if enough time has passed.
    Location lastLocationCoarseInterval = mLastLocationCoarseInterval.get(provider);
    if (lastLocationCoarseInterval == null) {
        lastLocationCoarseInterval = new Location(location);
        mLastLocationCoarseInterval.put(provider, lastLocationCoarseInterval);
    }
    long timeDiffNanos = location.getElapsedRealtimeNanos() - lastLocationCoarseInterval.getElapsedRealtimeNanos();
    if (timeDiffNanos > LocationFudger.FASTEST_INTERVAL_MS * NANOS_PER_MILLI) {
        lastLocationCoarseInterval.set(location);
    }
    // Don't ever return a coarse location that is more recent than the allowed update
    // interval (i.e. don't allow an app to keep registering and unregistering for
    // location updates to overcome the minimum interval).
    noGPSLocation = lastLocationCoarseInterval.getExtraLocation(Location.EXTRA_NO_GPS_LOCATION);
    // Skip if there are no UpdateRecords for this provider.
    ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider);
    if (records == null || records.size() == 0)
        return;
    // Fetch coarse location
    Location coarseLocation = null;
    if (noGPSLocation != null) {
        coarseLocation = mLocationFudger.getOrCreate(noGPSLocation);
    }
    // Fetch latest status update time
    long newStatusUpdateTime = p.getStatusUpdateTime();
    // Get latest status
    Bundle extras = new Bundle();
    int status = p.getStatus(extras);
    ArrayList<Receiver> deadReceivers = null;
    ArrayList<UpdateRecord> deadUpdateRecords = null;
    // Broadcast location or status to all listeners
    for (UpdateRecord r : records) {
        Receiver receiver = r.mReceiver;
        boolean receiverDead = false;
        int receiverUserId = UserHandle.getUserId(receiver.mUid);
        if (!isCurrentProfile(receiverUserId) && !isUidALocationProvider(receiver.mUid)) {
            if (D) {
                Log.d(TAG, "skipping loc update for background user " + receiverUserId + " (current user: " + mCurrentUserId + ", app: " + receiver.mPackageName + ")");
            }
            continue;
        }
        if (mBlacklist.isBlacklisted(receiver.mPackageName)) {
            if (D)
                Log.d(TAG, "skipping loc update for blacklisted app: " + receiver.mPackageName);
            continue;
        }
        if (!reportLocationAccessNoThrow(receiver.mPid, receiver.mUid, receiver.mPackageName, receiver.mAllowedResolutionLevel)) {
            if (D)
                Log.d(TAG, "skipping loc update for no op app: " + receiver.mPackageName);
            continue;
        }
        Location notifyLocation = null;
        if (receiver.mAllowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
            // use coarse location
            notifyLocation = coarseLocation;
        } else {
            // use fine location
            notifyLocation = lastLocation;
        }
        if (notifyLocation != null) {
            Location lastLoc = r.mLastFixBroadcast;
            if ((lastLoc == null) || shouldBroadcastSafe(notifyLocation, lastLoc, r, now)) {
                if (lastLoc == null) {
                    lastLoc = new Location(notifyLocation);
                    r.mLastFixBroadcast = lastLoc;
                } else {
                    lastLoc.set(notifyLocation);
                }
                if (!receiver.callLocationChangedLocked(notifyLocation)) {
                    Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
                    receiverDead = true;
                }
                r.mRequest.decrementNumUpdates();
            }
        }
        long prevStatusUpdateTime = r.mLastStatusBroadcast;
        if ((newStatusUpdateTime > prevStatusUpdateTime) && (prevStatusUpdateTime != 0 || status != LocationProvider.AVAILABLE)) {
            r.mLastStatusBroadcast = newStatusUpdateTime;
            if (!receiver.callStatusChangedLocked(provider, status, extras)) {
                receiverDead = true;
                Slog.w(TAG, "RemoteException calling onStatusChanged on " + receiver);
            }
        }
        // track expired records
        if (r.mRequest.getNumUpdates() <= 0 || r.mRequest.getExpireAt() < now) {
            if (deadUpdateRecords == null) {
                deadUpdateRecords = new ArrayList<UpdateRecord>();
            }
            deadUpdateRecords.add(r);
        }
        // track dead receivers
        if (receiverDead) {
            if (deadReceivers == null) {
                deadReceivers = new ArrayList<Receiver>();
            }
            if (!deadReceivers.contains(receiver)) {
                deadReceivers.add(receiver);
            }
        }
    }
    // remove dead records and receivers outside the loop
    if (deadReceivers != null) {
        for (Receiver receiver : deadReceivers) {
            removeUpdatesLocked(receiver);
        }
    }
    if (deadUpdateRecords != null) {
        for (UpdateRecord r : deadUpdateRecords) {
            r.disposeLocked(true);
        }
        applyRequirementsLocked(provider);
    }
}
Also used : Bundle(android.os.Bundle) BroadcastReceiver(android.content.BroadcastReceiver) LocationProviderInterface(com.android.server.location.LocationProviderInterface) Location(android.location.Location)

Example 78 with Location

use of android.location.Location in project android_frameworks_base by ResurrectionRemix.

the class LocationManagerService method handleLocationChanged.

private void handleLocationChanged(Location location, boolean passive) {
    // create a working copy of the incoming Location so that the service can modify it without
    // disturbing the caller's copy
    Location myLocation = new Location(location);
    String provider = myLocation.getProvider();
    // forward locations from mock providers, and should not grant them legitimacy in doing so.
    if (!myLocation.isFromMockProvider() && isMockProvider(provider)) {
        myLocation.setIsFromMockProvider(true);
    }
    synchronized (mLock) {
        if (isAllowedByCurrentUserSettingsLocked(provider)) {
            if (!passive) {
                location = screenLocationLocked(location, provider);
                if (location == null) {
                    return;
                }
                // notify passive provider of the new location
                mPassiveProvider.updateLocation(myLocation);
            }
            handleLocationChangedLocked(myLocation, passive);
        }
    }
}
Also used : Location(android.location.Location)

Example 79 with Location

use of android.location.Location in project AndroidChromium by JackyAndroid.

the class GeolocationTracker method refreshLastKnownLocation.

/**
     * Requests an updated location if the last known location is older than maxAge milliseconds.
     *
     * Note: this must be called only on the UI thread.
     */
@SuppressFBWarnings("LI_LAZY_INIT_UPDATE_STATIC")
static void refreshLastKnownLocation(Context context, long maxAge) {
    ThreadUtils.assertOnUiThread();
    // We're still waiting for a location update.
    if (sListener != null)
        return;
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    if (location == null || getLocationAge(location) > maxAge) {
        String provider = LocationManager.NETWORK_PROVIDER;
        if (locationManager.isProviderEnabled(provider)) {
            sListener = new SelfCancelingListener(locationManager);
            locationManager.requestSingleUpdate(provider, sListener, null);
        }
    }
}
Also used : LocationManager(android.location.LocationManager) Location(android.location.Location) SuppressFBWarnings(org.chromium.base.annotations.SuppressFBWarnings)

Example 80 with Location

use of android.location.Location in project OneSignal-Android-SDK by OneSignal.

the class ShadowFusedLocationApiWrapper method getLastLocation.

public static Location getLastLocation(GoogleApiClient googleApiClient) {
    Location location = new Location("");
    location.setLatitude(lat);
    location.setLongitude(log);
    location.setAccuracy(accuracy);
    location.setTime(time);
    return location;
}
Also used : Location(android.location.Location)

Aggregations

Location (android.location.Location)290 Bundle (android.os.Bundle)50 LocationListener (android.location.LocationListener)38 LocationManager (android.location.LocationManager)33 ArrayList (java.util.ArrayList)29 Criteria (android.location.Criteria)20 LocationProviderInterface (com.android.server.location.LocationProviderInterface)18 GsmCellLocation (android.telephony.gsm.GsmCellLocation)17 BluetoothAdapter (android.bluetooth.BluetoothAdapter)12 BroadcastReceiver (android.content.BroadcastReceiver)12 Handler (android.os.Handler)10 MockProvider (com.android.server.location.MockProvider)9 Intent (android.content.Intent)8 Timer (java.util.Timer)8 Test (org.junit.Test)8 PendingIntent (android.app.PendingIntent)7 IOException (java.io.IOException)7 LocationProviderProxy (com.android.server.location.LocationProviderProxy)6 HashMap (java.util.HashMap)6 List (java.util.List)6