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

Commit 4c5240c2 authored by Chris Tran's avatar Chris Tran Committed by Android (Google) Code Review
Browse files

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

parents 9c3fa97e 529c720a
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