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

Commit 6c87ec40 authored by Anil Admal's avatar Anil Admal Committed by Android (Google) Code Review
Browse files

Merge "User notification of NFW emergency requests similar to IGnssNi.hal" into qt-dev

parents 0f0a12cc 8a246a2b
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -357,8 +357,10 @@ public class GpsNetInitiatedHandler {
        }
    }

    // Sets the NI notification.
    private synchronized void setNiNotification(GpsNiNotification notif) {
    /**
     * Posts a notification in the status bar using the contents in {@code notif} object.
     */
    public synchronized void setNiNotification(GpsNiNotification notif) {
        NotificationManager notificationManager = (NotificationManager) mContext
                .getSystemService(Context.NOTIFICATION_SERVICE);
        if (notificationManager == null) {
@@ -539,14 +541,14 @@ public class GpsNetInitiatedHandler {
     */
    static private String decodeString(String original, boolean isHex, int coding)
    {
        if (coding == GPS_ENC_NONE) {
            return original;
        }

        String decoded = original;
        byte[] input = stringToByteArray(original, isHex);

        switch (coding) {
        case GPS_ENC_NONE:
            decoded = original;
            break;

        case GPS_ENC_SUPL_GSM_DEFAULT:
            decoded = decodeGSMPackedString(input);
            break;
+1 −1
Original line number Diff line number Diff line
@@ -2055,7 +2055,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
            setupNativeGnssService(/* reinitializeGnssServiceHandle = */ false);

            if (native_is_gnss_visibility_control_supported()) {
                mGnssVisibilityControl = new GnssVisibilityControl(mContext, mLooper);
                mGnssVisibilityControl = new GnssVisibilityControl(mContext, mLooper, mNIHandler);
            }

            // load default GPS configuration
+53 −12
Original line number Diff line number Diff line
@@ -33,6 +33,9 @@ import android.util.ArrayMap;
import android.util.Log;
import android.util.StatsLog;

import com.android.internal.R;
import com.android.internal.location.GpsNetInitiatedHandler;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -65,6 +68,7 @@ class GnssVisibilityControl {

    private final Handler mHandler;
    private final Context mContext;
    private final GpsNetInitiatedHandler mNiHandler;

    private boolean mIsGpsEnabled;

@@ -76,11 +80,12 @@ class GnssVisibilityControl {
    private PackageManager.OnPermissionsChangedListener mOnPermissionsChangedListener =
            uid -> runOnHandler(() -> handlePermissionsChanged(uid));

    GnssVisibilityControl(Context context, Looper looper) {
    GnssVisibilityControl(Context context, Looper looper, GpsNetInitiatedHandler niHandler) {
        mContext = context;
        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
        mHandler = new Handler(looper);
        mNiHandler = niHandler;
        mAppOps = mContext.getSystemService(AppOpsManager.class);
        mPackageManager = mContext.getPackageManager();

@@ -250,6 +255,9 @@ class GnssVisibilityControl {
        private static final byte NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED = 1;
        private static final byte NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED = 2;

        // This must match with NfwProtocolStack enum in IGnssVisibilityControlCallback.hal.
        private static final byte NFW_PROTOCOL_STACK_SUPL = 1;

        private final String mProxyAppPackageName;
        private final byte mProtocolStack;
        private final String mOtherProtocolStackName;
@@ -299,6 +307,10 @@ class GnssVisibilityControl {
            return mResponseType != NfwNotification.NFW_RESPONSE_TYPE_REJECTED;
        }

        private boolean isLocationProvided() {
            return mResponseType == NfwNotification.NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED;
        }

        private boolean isRequestAttributedToProxyApp() {
            return !TextUtils.isEmpty(mProxyAppPackageName);
        }
@@ -306,6 +318,10 @@ class GnssVisibilityControl {
        private boolean isEmergencyRequestNotification() {
            return mInEmergencyMode && !isRequestAttributedToProxyApp();
        }

        private boolean isRequestTypeSupl() {
            return mProtocolStack == NFW_PROTOCOL_STACK_SUPL;
        }
    }

    private void handlePermissionsChanged(int uid) {
@@ -431,15 +447,14 @@ class GnssVisibilityControl {
            }

            Log.e(TAG, "ProxyAppPackageName field is not set. AppOps service not notified"
                    + "for non-framework location access notification: " + nfwNotification);
                    + " for notification: " + nfwNotification);
            return;
        }

        if (isLocationPermissionEnabled == null) {
            Log.w(TAG, "Could not find proxy app with name: " + proxyAppPkgName + " in the "
                    + "value specified for config parameter: "
                    + GnssConfiguration.CONFIG_NFW_PROXY_APPS + ". AppOps service not notified "
                    + "for non-framework location access notification: " + nfwNotification);
            Log.w(TAG, "Could not find proxy app " + proxyAppPkgName + " in the value specified for"
                    + " config parameter: " + GnssConfiguration.CONFIG_NFW_PROXY_APPS
                    + ". AppOps service not notified for notification: " + nfwNotification);
            return;
        }

@@ -447,8 +462,7 @@ class GnssVisibilityControl {
        final ApplicationInfo proxyAppInfo = getProxyAppInfo(proxyAppPkgName);
        if (proxyAppInfo == null) {
            Log.e(TAG, "Proxy app " + proxyAppPkgName + " is not found. AppOps service not "
                    + "notified for non-framework location access notification: "
                    + nfwNotification);
                    + "notified for notification: " + nfwNotification);
            return;
        }

@@ -465,13 +479,40 @@ class GnssVisibilityControl {
    }

    private void handleEmergencyNfwNotification(NfwNotification nfwNotification) {
        boolean isPermissionMismatched =
                (nfwNotification.mResponseType == NfwNotification.NFW_RESPONSE_TYPE_REJECTED);
        if (isPermissionMismatched) {
        boolean isPermissionMismatched = false;
        if (!nfwNotification.isRequestAccepted()) {
            Log.e(TAG, "Emergency non-framework location request incorrectly rejected."
                    + " Notification: " + nfwNotification);
            isPermissionMismatched = true;
        }

        if (!mNiHandler.getInEmergency()) {
            Log.w(TAG, "Emergency state mismatch. Device currently not in user initiated emergency"
                    + " session. Notification: " + nfwNotification);
            isPermissionMismatched = true;
        }

        logEvent(nfwNotification, isPermissionMismatched);

        if (nfwNotification.isLocationProvided()) {
            // Emulate deprecated IGnssNi.hal user notification of emergency NI requests.
            GpsNetInitiatedHandler.GpsNiNotification notification =
                    new GpsNetInitiatedHandler.GpsNiNotification();
            notification.notificationId = 0;
            notification.niType = nfwNotification.isRequestTypeSupl()
                    ? GpsNetInitiatedHandler.GPS_NI_TYPE_EMERGENCY_SUPL
                    : GpsNetInitiatedHandler.GPS_NI_TYPE_UMTS_CTRL_PLANE;
            notification.needNotify = true;
            notification.needVerify = false;
            notification.privacyOverride = false;
            notification.timeout = 0;
            notification.defaultResponse = GpsNetInitiatedHandler.GPS_NI_RESPONSE_NORESP;
            notification.requestorId = nfwNotification.mRequestorId;
            notification.requestorIdEncoding = GpsNetInitiatedHandler.GPS_ENC_NONE;
            notification.text = mContext.getString(R.string.global_action_emergency);
            notification.textEncoding = GpsNetInitiatedHandler.GPS_ENC_NONE;
            mNiHandler.setNiNotification(notification);
        }
    }

    private void logEvent(NfwNotification notification, boolean isPermissionMismatched) {