location: Replace ILocationCollector interface with new ILocationProvider method

This change replaces ILocationCollector with a more general mechanism that
passes locations received from a provider to all other providers.
The network location provider now uses this to implement the location collector.
In the future, this could be used to inject network locations to the GPS
as aiding data.

This change also removes the now obsolete permission INSTALL_LOCATION_COLLECTOR.

Signed-off-by: Mike Lockwood <lockwood@android.com>
This commit is contained in:
Mike Lockwood
2009-05-21 11:28:20 -04:00
parent bb7b7b316a
commit fd6e5f0dda
14 changed files with 32 additions and 114 deletions

View File

@@ -135,7 +135,6 @@ LOCAL_SRC_FILES += \
location/java/android/location/IGeocodeProvider.aidl \
location/java/android/location/IGpsStatusListener.aidl \
location/java/android/location/IGpsStatusProvider.aidl \
location/java/android/location/ILocationCollector.aidl \
location/java/android/location/ILocationListener.aidl \
location/java/android/location/ILocationManager.aidl \
location/java/android/location/ILocationProvider.aidl \

View File

@@ -529,17 +529,6 @@
visibility="public"
>
</field>
<field name="INSTALL_LOCATION_COLLECTOR"
type="java.lang.String"
transient="false"
volatile="false"
value="&quot;android.permission.INSTALL_LOCATION_COLLECTOR&quot;"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="INSTALL_LOCATION_PROVIDER"
type="java.lang.String"
transient="false"

View File

@@ -220,12 +220,6 @@
android:label="@string/permlab_installLocationProvider"
android:description="@string/permdesc_installLocationProvider" />
<!-- Allows an application to install a location collector into the Location Manager -->
<permission android:name="android.permission.INSTALL_LOCATION_COLLECTOR"
android:protectionLevel="signatureOrSystem"
android:label="@string/permlab_installLocationCollector"
android:description="@string/permdesc_installLocationCollector" />
<!-- ======================================= -->
<!-- Permissions for accessing networks -->
<!-- ======================================= -->

View File

@@ -769,13 +769,7 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_installLocationProvider">Create mock location sources for testing.
Malicious applications can use this to override the location and/or status returned by real
location sources such as GPS or Network providers.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_installLocationCollector">permission to install a location collector</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_installLocationCollector">Create mock location sources for testing.
Malicious applications can use this to monitor and report your location to an external source.</string>
location sources such as GPS or Network providers or monitor and report your location to an external source.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_accessFineLocation">fine (GPS) location</string>

View File

@@ -133,7 +133,6 @@
<assign-permission name="android.permission.READ_FRAME_BUFFER" uid="shell" />
<assign-permission name="android.permission.DEVICE_POWER" uid="shell" />
<assign-permission name="android.permission.INSTALL_LOCATION_PROVIDER" uid="shell" />
<assign-permission name="android.permission.INSTALL_LOCATION_COLLECTOR" uid="shell" />
<assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="media" />
<assign-permission name="android.permission.ACCESS_DRM" uid="media" />

View File

@@ -1,36 +0,0 @@
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.location;
import android.location.Location;
/**
* Listens for GPS and cell/wifi changes and anonymously uploads to server
* for improving quality of service of NetworkLocationProvider.
* This service is only enabled when the user has enabled the
* network location provider.
*
* {@hide}
*/
oneway interface ILocationCollector {
/**
* Updates GPS location if collection is enabled
*
* @param location location object
*/
void updateLocation(in Location location);
}

View File

@@ -20,7 +20,6 @@ import android.app.PendingIntent;
import android.location.Address;
import android.location.IGeocodeProvider;
import android.location.IGpsStatusListener;
import android.location.ILocationCollector;
import android.location.ILocationListener;
import android.location.ILocationProvider;
import android.location.Location;
@@ -83,6 +82,5 @@ interface ILocationManager
/* for installing external Location Providers */
void installLocationProvider(String name, ILocationProvider provider);
void installLocationCollector(ILocationCollector collector);
void installGeocodeProvider(IGeocodeProvider provider);
}

View File

@@ -16,6 +16,7 @@
package android.location;
import android.location.Location;
import android.os.Bundle;
/**
@@ -41,6 +42,7 @@ interface ILocationProvider {
void enableLocationTracking(boolean enable);
void setMinTime(long minTime);
void updateNetworkState(int state);
void updateLocation(in Location location);
boolean sendExtraCommand(String command, inout Bundle extras);
void addListener(int uid);
void removeListener(int uid);

View File

@@ -1278,27 +1278,6 @@ public class LocationManager {
}
}
/**
* Installs a location collector.
*
* @param provider Binder interface for the location collector
*
* @return true if the command succeeds.
*
* Requires the android.permission.INSTALL_LOCATION_COLLECTOR permission.
*
* {@hide}
*/
public boolean installLocationCollector(ILocationCollector collector) {
try {
mService.installLocationCollector(collector);
return true;
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in setLocationCollector: ", e);
return false;
}
}
/**
* Installs a geocoder server.
*

View File

@@ -405,6 +405,13 @@ public class GpsLocationProvider extends ILocationProvider.Stub {
}
}
/**
* This is called to inform us when another location provider returns a location.
* Someday we might use this for network location injection to aid the GPS
*/
public void updateLocation(Location location) {
}
/**
* Returns true if the provider requires access to a
* satellite-based positioning system (e.g., GPS), false

View File

@@ -219,6 +219,14 @@ public class LocationProviderProxy implements IBinder.DeathRecipient {
}
}
public void updateLocation(Location location) {
try {
mProvider.updateLocation(location);
} catch (RemoteException e) {
Log.e(TAG, "updateLocation failed", e);
}
}
public boolean sendExtraCommand(String command, Bundle extras) {
try {
return mProvider.sendExtraCommand(command, extras);

View File

@@ -172,6 +172,9 @@ public class MockProvider extends ILocationProvider.Stub {
public void updateNetworkState(int state) {
}
public void updateLocation(Location location) {
}
public boolean sendExtraCommand(String command, Bundle extras) {
return false;
}

View File

@@ -46,7 +46,6 @@ import android.location.Address;
import android.location.IGeocodeProvider;
import android.location.IGpsStatusListener;
import android.location.IGpsStatusProvider;
import android.location.ILocationCollector;
import android.location.ILocationListener;
import android.location.ILocationManager;
import android.location.ILocationProvider;
@@ -107,8 +106,6 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
android.Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS;
private static final String INSTALL_LOCATION_PROVIDER =
android.Manifest.permission.INSTALL_LOCATION_PROVIDER;
private static final String INSTALL_LOCATION_COLLECTOR =
android.Manifest.permission.INSTALL_LOCATION_COLLECTOR;
// Set of providers that are explicitly enabled
private final Set<String> mEnabledProviders = new HashSet<String>();
@@ -171,9 +168,6 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
private HashMap<String,Location> mLastKnownLocation =
new HashMap<String,Location>();
// Location collector
private ILocationCollector mCollector;
private int mNetworkState = LocationProvider.TEMPORARILY_UNAVAILABLE;
// for Settings change notification
@@ -630,16 +624,6 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
}
}
public void installLocationCollector(ILocationCollector collector) {
if (mContext.checkCallingOrSelfPermission(INSTALL_LOCATION_COLLECTOR)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires INSTALL_LOCATION_COLLECTOR permission");
}
// FIXME - only support one collector
mCollector = collector;
}
public void installGeocodeProvider(IGeocodeProvider provider) {
if (mContext.checkCallingOrSelfPermission(INSTALL_LOCATION_PROVIDER)
!= PackageManager.PERMISSION_GRANTED) {
@@ -1619,23 +1603,19 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
synchronized (mLock) {
Location location = (Location) msg.obj;
String provider = location.getProvider();
if (mCollector != null &&
LocationManager.GPS_PROVIDER.equals(location.getProvider())) {
try {
mCollector.updateLocation(location);
} catch (RemoteException e) {
Log.w(TAG, "mCollector.updateLocation failed");
mCollector = null;
// notify other providers of the new location
for (int i = mProviders.size() - 1; i >= 0; i--) {
LocationProviderProxy proxy = mProviders.get(i);
if (!provider.equals(proxy.getName())) {
proxy.updateLocation(location);
}
}
String provider = location.getProvider();
if (!isAllowedBySettingsLocked(provider)) {
return;
if (isAllowedBySettingsLocked(provider)) {
handleLocationChangedLocked(location);
}
handleLocationChangedLocked(location);
}
}
} catch (Exception e) {
@@ -1935,7 +1915,6 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
synchronized (mLock) {
pw.println("Current Location Manager state:");
pw.println(" sProvidersLoaded=" + sProvidersLoaded);
pw.println(" mCollector=" + mCollector);
pw.println(" Listeners:");
int N = mReceivers.size();
for (int i=0; i<N; i++) {

View File

@@ -159,6 +159,9 @@ public class TestLocationProvider extends ILocationProvider.Stub {
public void updateNetworkState(int state) {
}
public void updateLocation(Location location) {
}
public boolean sendExtraCommand(String command, Bundle extras) {
return false;
}