Merge "Log when emergency state changes to track location-related AppOps"

This commit is contained in:
Chris Tran
2023-02-28 08:59:39 +00:00
committed by Android (Google) Code Review
6 changed files with 71 additions and 2 deletions

View File

@@ -296,6 +296,8 @@ public class LocationManagerService extends ILocationManager.Stub implements
refreshAppOpsRestrictions(userId);
}
});
mInjector.getEmergencyHelper().addOnEmergencyStateChangedListener(
this::onEmergencyStateChanged);
// set up passive provider first since it will be required for all other location providers,
// which are loaded later once the system is ready.
@@ -567,6 +569,11 @@ public class LocationManagerService extends ILocationManager.Stub implements
refreshAppOpsRestrictions(userId);
}
private void onEmergencyStateChanged() {
boolean isInEmergency = mInjector.getEmergencyHelper().isInEmergency(Long.MIN_VALUE);
mInjector.getLocationUsageLogger().logEmergencyStateChanged(isInEmergency);
}
private void logLocationEnabledState() {
boolean locationEnabled = false;
// Location setting is considered on if it is enabled for any one user

View File

@@ -16,14 +16,55 @@
package com.android.server.location.injector;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Provides helpers for emergency sessions.
*/
public abstract class EmergencyHelper {
private final CopyOnWriteArrayList<EmergencyStateChangedListener> mListeners;
protected EmergencyHelper() {
mListeners = new CopyOnWriteArrayList<>();
}
/**
* Listener for emergency state changes.
*/
public interface EmergencyStateChangedListener {
/**
* Called when state changes.
*/
void onStateChanged();
}
/**
* Returns true if the device is in an emergency session, or if an emergency session ended
* within the given extension time.
*/
public abstract boolean isInEmergency(long extensionTimeMs);
/**
* Add a listener for changes to the emergency location state.
*/
public void addOnEmergencyStateChangedListener(EmergencyStateChangedListener listener) {
mListeners.add(listener);
}
/**
* Remove a listener for changes to the emergency location state.
*/
public void removeOnEmergencyStateChangedListener(EmergencyStateChangedListener listener) {
mListeners.remove(listener);
}
/**
* Notify listeners for emergency state of state change
*/
protected final void dispatchEmergencyStateChanged() {
for (EmergencyStateChangedListener listener : mListeners) {
listener.onStateChanged();
}
}
}

View File

@@ -16,13 +16,11 @@
package com.android.server.location.injector;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.location.settings.LocationSettings;
/**
* Injects various location dependencies so that they may be controlled by tests.
*/
@VisibleForTesting
public interface Injector {
/** Returns a UserInfoHelper. */

View File

@@ -129,6 +129,13 @@ public class LocationUsageLogger {
FrameworkStatsLog.write(FrameworkStatsLog.LOCATION_ENABLED_STATE_CHANGED, enabled);
}
/**
* Log emergency location state change event
*/
public synchronized void logEmergencyStateChanged(boolean isInEmergency) {
FrameworkStatsLog.write(FrameworkStatsLog.EMERGENCY_STATE_CHANGED, isInEmergency);
}
private static int bucketizeProvider(String provider) {
if (LocationManager.NETWORK_PROVIDER.equals(provider)) {
return LocationStatsEnums.PROVIDER_NETWORK;

View File

@@ -27,6 +27,7 @@ import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.internal.telephony.TelephonyIntents;
import com.android.server.FgThread;
import java.util.Objects;
@@ -73,12 +74,25 @@ public class SystemEmergencyHelper extends EmergencyHelper {
try {
mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber(
intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
dispatchEmergencyStateChanged();
} catch (IllegalStateException e) {
Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e);
}
}
}
}, new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL));
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED.equals(
intent.getAction())) {
return;
}
dispatchEmergencyStateChanged();
}
}, new IntentFilter(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED));
}
@Override
@@ -108,6 +122,7 @@ public class SystemEmergencyHelper extends EmergencyHelper {
if (mIsInEmergencyCall) {
mEmergencyCallEndRealtimeMs = SystemClock.elapsedRealtime();
mIsInEmergencyCall = false;
dispatchEmergencyStateChanged();
}
}
}

View File

@@ -27,6 +27,7 @@ public class FakeEmergencyHelper extends EmergencyHelper {
public void setInEmergency(boolean inEmergency) {
mInEmergency = inEmergency;
dispatchEmergencyStateChanged();
}
@Override