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

Commit 4ee43bea authored by Soonil Nagarkar's avatar Soonil Nagarkar Committed by Automerger Merge Worker
Browse files

DO NOT MERGE Update NFW location access notification strings am: bfef65af...

DO NOT MERGE Update NFW location access notification strings am: bfef65af am: 77a0961a am: dafe9975

Change-Id: I6584de96d7d5f3dd162f2600a0fe2aaa7b4c6207
parents c4ff1b35 dafe9975
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -3897,6 +3897,19 @@
         information. -->
    <string name="gpsVerifNo">No</string>

    <!-- Notification title shown to user to inform them their device location was accessed by
         an external entity during an emergency (usually an emergency phone call).
         [CHAR LIMIT=40] -->
    <string name="gnss_nfw_notification_title">Emergency location accessed</string>
    <!-- Notification message shown to user to inform them their device location was accessed by
         something OEM related during an emergency (usually an emergency phone call).
         [CHAR LIMIT=NONE] -->
    <string name="gnss_nfw_notification_message_oem">Your device manufacturer accessed your location during a recent emergency session</string>
    <!-- Notification message shown to user to inform them their device location was accessed by
         something carrier related during an emergency (usually an emergency phone call).
         [CHAR LIMIT=NONE] -->
    <string name="gnss_nfw_notification_message_carrier">Your carrier accessed your location during a recent emergency session</string>

    <!-- Error message when the sync tried to delete too many things -->
    <string name="sync_too_many_deletes">Delete limit exceeded</string>
    <!-- Dialog message for when there are too many deletes that would take place and we want user confirmation -->
+3 −0
Original line number Diff line number Diff line
@@ -740,6 +740,9 @@
  <java-symbol type="string" name="gpsNotifTitle" />
  <java-symbol type="string" name="gpsVerifNo" />
  <java-symbol type="string" name="gpsVerifYes" />
  <java-symbol type="string" name="gnss_nfw_notification_title" />
  <java-symbol type="string" name="gnss_nfw_notification_message_carrier" />
  <java-symbol type="string" name="gnss_nfw_notification_message_oem" />
  <java-symbol type="string" name="gsm_alphabet_default_charset" />
  <java-symbol type="string" name="httpError" />
  <java-symbol type="string" name="httpErrorAuth" />
+4 −0
Original line number Diff line number Diff line
@@ -256,6 +256,10 @@ message SystemMessage {
    // Package: android
    NOTE_ADB_WIFI_ACTIVE = 62;

    // Notify user there was a non-framework gnss location access during an emergency
    // Package: android
    NOTE_GNSS_NFW_LOCATION_ACCESS = 63;

    // ADD_NEW_IDS_ABOVE_THIS_LINE
    // Legacy IDs with arbitrary values appear below
    // Legacy IDs existed as stable non-conflicting constants prior to the O release
+46 −48
Original line number Diff line number Diff line
@@ -21,13 +21,13 @@ import android.annotation.SuppressLint;
import android.app.AppOpsManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.hardware.gnss.visibility_control.V1_0.IGnssVisibilityControlCallback;
import android.location.LocationManager;
import android.os.Handler;
import android.os.Looper;
@@ -39,12 +39,14 @@ import android.util.Log;

import com.android.internal.R;
import com.android.internal.location.GpsNetInitiatedHandler;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.util.FrameworkStatsLog;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Handles GNSS non-framework location access user visibility and control.
@@ -283,21 +285,22 @@ class GnssVisibilityControl {

    // Represents NfwNotification structure in IGnssVisibilityControlCallback.hal
    private static class NfwNotification {
        // These must match with NfwResponseType enum in IGnssVisibilityControlCallback.hal.
        private static final byte NFW_RESPONSE_TYPE_REJECTED = 0;
        private static final byte NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED = 1;
        private static final byte NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED = 2;

        private final String mProxyAppPackageName;
        private final byte mProtocolStack;
        private final String mOtherProtocolStackName;
        private final byte mRequestor;
        private final String mRequestorId;
        private final byte mResponseType;
        private final boolean mInEmergencyMode;
        private final boolean mIsCachedLocation;

        private NfwNotification(String proxyAppPackageName, byte protocolStack,

        // These must match with NfwResponseType enum in IGnssVisibilityControlCallback.hal
        static final byte NFW_RESPONSE_TYPE_REJECTED = 0;
        static final byte NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED = 1;
        static final byte NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED = 2;

        final String mProxyAppPackageName;
        final byte mProtocolStack;
        final String mOtherProtocolStackName;
        final byte mRequestor;
        final String mRequestorId;
        final byte mResponseType;
        final boolean mInEmergencyMode;
        final boolean mIsCachedLocation;

        NfwNotification(String proxyAppPackageName, byte protocolStack,
                String otherProtocolStackName, byte requestor, String requestorId,
                byte responseType, boolean inEmergencyMode, boolean isCachedLocation) {
            mProxyAppPackageName = proxyAppPackageName;
@@ -610,43 +613,38 @@ class GnssVisibilityControl {
        logEvent(nfwNotification, isPermissionMismatched);

        if (nfwNotification.isLocationProvided()) {
            postEmergencyLocationUserNotification(nfwNotification);
        }
            displayNfwNotification(nfwNotification);
        }

    private void postEmergencyLocationUserNotification(NfwNotification nfwNotification) {
        // Emulate deprecated IGnssNi.hal user notification of emergency NI requests.
        NotificationManager notificationManager = (NotificationManager) mContext
                .getSystemService(Context.NOTIFICATION_SERVICE);
        if (notificationManager == null) {
            Log.w(TAG, "Could not notify user of emergency location request. Notification: "
                    + nfwNotification);
            return;
    }

        notificationManager.notifyAsUser(/* tag= */ null, /* notificationId= */ 0,
                createEmergencyLocationUserNotification(mContext), UserHandle.ALL);
    }
    private void displayNfwNotification(NfwNotification nfwNotification) {
        NotificationManager notificationManager = Objects.requireNonNull(
                mContext.getSystemService(NotificationManager.class));

    private static Notification createEmergencyLocationUserNotification(Context context) {
        // NOTE: Do not reuse the returned notification object as it will not reflect
        //       changes to notification text when the system language is changed.
        final String firstLineText = context.getString(R.string.gpsNotifTitle);
        final String secondLineText =  context.getString(R.string.global_action_emergency);
        final String accessibilityServicesText = firstLineText + " (" + secondLineText + ")";
        return new Notification.Builder(context, SystemNotificationChannels.NETWORK_ALERTS)
                .setSmallIcon(com.android.internal.R.drawable.stat_sys_gps_on)
                .setWhen(0)
                .setOngoing(false)
        String title = mContext.getString(R.string.gnss_nfw_notification_title);
        String message;
        if (nfwNotification.mRequestor == IGnssVisibilityControlCallback.NfwRequestor.CARRIER) {
            message = mContext.getString(R.string.gnss_nfw_notification_message_carrier);
        } else {
            message = mContext.getString(R.string.gnss_nfw_notification_message_oem);
        }

        Notification.Builder builder = new Notification.Builder(mContext,
                SystemNotificationChannels.NETWORK_ALERTS)
                .setSmallIcon(R.drawable.stat_sys_gps_on)
                .setCategory(Notification.CATEGORY_SYSTEM)
                .setVisibility(Notification.VISIBILITY_SECRET)
                .setContentTitle(title)
                .setTicker(title)
                .setContentText(message)
                .setStyle(new Notification.BigTextStyle().bigText(message))
                .setAutoCancel(true)
                .setColor(context.getColor(
                        com.android.internal.R.color.system_notification_accent_color))
                .setDefaults(0)
                .setTicker(accessibilityServicesText)
                .setContentTitle(firstLineText)
                .setContentText(secondLineText)
                .setContentIntent(PendingIntent.getBroadcast(context, 0, new Intent(), 0))
                .build();
                .setColor(mContext.getColor(R.color.system_notification_accent_color))
                .setWhen(System.currentTimeMillis())
                .setShowWhen(true)
                .setDefaults(0);

        notificationManager.notify(SystemMessage.NOTE_GNSS_NFW_LOCATION_ACCESS, builder.build());
    }

    private void logEvent(NfwNotification notification, boolean isPermissionMismatched) {