Log when emergency state changes to track location-related AppOps
Bug: 262906568 Test: manual test Change-Id: If703872633c9a31857260911091590953cbfe387
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ public class FakeEmergencyHelper extends EmergencyHelper {
|
||||
|
||||
public void setInEmergency(boolean inEmergency) {
|
||||
mInEmergency = inEmergency;
|
||||
dispatchEmergencyStateChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user