Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 529c720a authored by Chris Tran's avatar Chris Tran
Browse files

Log when emergency state changes to track location-related AppOps

Bug: 262906568
Test: manual test
Change-Id: If703872633c9a31857260911091590953cbfe387
parent 969b9265
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
+41 −0
Original line number Diff line number Diff line
@@ -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();
        }
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -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. */
+7 −0
Original line number Diff line number Diff line
@@ -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;
+15 −0
Original line number Diff line number Diff line
@@ -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();
                    }
                }
            }
Loading