Loading services/core/java/com/android/server/location/LocationManagerService.java +7 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading services/core/java/com/android/server/location/injector/EmergencyHelper.java +41 −0 Original line number Diff line number Diff line Loading @@ -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(); } } } services/core/java/com/android/server/location/injector/Injector.java +0 −2 Original line number Diff line number Diff line Loading @@ -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. */ Loading services/core/java/com/android/server/location/injector/LocationUsageLogger.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -108,6 +122,7 @@ public class SystemEmergencyHelper extends EmergencyHelper { if (mIsInEmergencyCall) { mEmergencyCallEndRealtimeMs = SystemClock.elapsedRealtime(); mIsInEmergencyCall = false; dispatchEmergencyStateChanged(); } } } Loading Loading
services/core/java/com/android/server/location/LocationManagerService.java +7 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading
services/core/java/com/android/server/location/injector/EmergencyHelper.java +41 −0 Original line number Diff line number Diff line Loading @@ -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(); } } }
services/core/java/com/android/server/location/injector/Injector.java +0 −2 Original line number Diff line number Diff line Loading @@ -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. */ Loading
services/core/java/com/android/server/location/injector/LocationUsageLogger.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -108,6 +122,7 @@ public class SystemEmergencyHelper extends EmergencyHelper { if (mIsInEmergencyCall) { mEmergencyCallEndRealtimeMs = SystemClock.elapsedRealtime(); mIsInEmergencyCall = false; dispatchEmergencyStateChanged(); } } } Loading