summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Jiang <qiangjiang@google.com>2020-07-21 17:19:53 -0700
committerNate Jiang <qiangjiang@google.com>2020-07-30 16:02:11 +0000
commitd24e64f18b07bbe9dba4c765f8fd27dcc5744855 (patch)
treed7c3883f1ab16938e9a940da792a8602dab9f32f
parentfde627ad0f1a63138be533b2350f1481a28f5990 (diff)
Update IMSI protection notification flow
Bug: 161932419 Test: atest com.android.server.wifi Merged-In: I8be7c1b9e66162fdd244946b47367290116a7747 Change-Id: I922a46fee984721ca2fef8c0e2c1307718b2b7e8
-rw-r--r--libs/WifiTrackerLib/res/values/strings.xml2
-rw-r--r--service/AndroidManifest_Resources.xml1
-rw-r--r--service/java/com/android/server/wifi/WifiCarrierInfoManager.java22
-rw-r--r--service/res/values/strings.xml6
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java75
5 files changed, 72 insertions, 34 deletions
diff --git a/libs/WifiTrackerLib/res/values/strings.xml b/libs/WifiTrackerLib/res/values/strings.xml
index c238f663c..7e81b5877 100644
--- a/libs/WifiTrackerLib/res/values/strings.xml
+++ b/libs/WifiTrackerLib/res/values/strings.xml
@@ -170,7 +170,7 @@
<string name="osu_sign_up_complete">Sign-up complete. Connecting\u2026</string>
<!-- IMSI protection warning for non-protection network [CHAR LIMIT=NONE] -->
- <string name="imsi_protection_warning">This network receives a unique ID that can be used to track device location. <annotation id="url">Learn more</annotation></string>
+ <string name="imsi_protection_warning">This network receives a SIM ID that can be used to track device location. <annotation id="url">Learn more</annotation></string>
<!-- Help URL, IMSI protection [DO NOT TRANSLATE] -->
<string name="help_url_imsi_protection" translatable="false"></string>
diff --git a/service/AndroidManifest_Resources.xml b/service/AndroidManifest_Resources.xml
index 6d637cb53..04ba1d38b 100644
--- a/service/AndroidManifest_Resources.xml
+++ b/service/AndroidManifest_Resources.xml
@@ -22,6 +22,7 @@
coreApp="true"
android:versionCode="1"
android:versionName="R-initial">
+ <protected-broadcast android:name="com.android.server.wifi.action.CarrierNetwork.USER_CLICKED" />
<application
android:label="@string/wifiResourcesAppLabel"
android:defaultToDeviceProtectedStorage="true"
diff --git a/service/java/com/android/server/wifi/WifiCarrierInfoManager.java b/service/java/com/android/server/wifi/WifiCarrierInfoManager.java
index d483047d2..047f9139d 100644
--- a/service/java/com/android/server/wifi/WifiCarrierInfoManager.java
+++ b/service/java/com/android/server/wifi/WifiCarrierInfoManager.java
@@ -16,6 +16,8 @@
package com.android.server.wifi;
+import static android.Manifest.permission.NETWORK_SETTINGS;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.AlertDialog;
@@ -96,6 +98,10 @@ public class WifiCarrierInfoManager {
@VisibleForTesting
public static final String NOTIFICATION_USER_DISMISSED_INTENT_ACTION =
"com.android.server.wifi.action.CarrierNetwork.USER_DISMISSED";
+ /** Intent when user clicked on the notification. */
+ @VisibleForTesting
+ public static final String NOTIFICATION_USER_CLICKED_INTENT_ACTION =
+ "com.android.server.wifi.action.CarrierNetwork.USER_CLICKED";
@VisibleForTesting
public static final String EXTRA_CARRIER_NAME =
"com.android.server.wifi.extra.CarrierNetwork.CARRIER_NAME";
@@ -223,14 +229,16 @@ public class WifiCarrierInfoManager {
switch (intent.getAction()) {
case NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION:
- Log.i(TAG, "User clicked to allow carrier");
- sendImsiPrivacyConfirmationDialog(carrierName, carrierId);
- // Collapse the notification bar
- mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ handleUserAllowCarrierExemptionAction(carrierName, carrierId);
break;
case NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION:
handleUserDisallowCarrierExemptionAction(carrierName, carrierId);
break;
+ case NOTIFICATION_USER_CLICKED_INTENT_ACTION:
+ sendImsiPrivacyConfirmationDialog(carrierName, carrierId);
+ // Collapse the notification bar
+ mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ break;
case NOTIFICATION_USER_DISMISSED_INTENT_ACTION:
handleUserDismissAction();
return; // no need to cancel a dismissed notification, return.
@@ -297,8 +305,9 @@ public class WifiCarrierInfoManager {
mIntentFilter.addAction(NOTIFICATION_USER_DISMISSED_INTENT_ACTION);
mIntentFilter.addAction(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION);
mIntentFilter.addAction(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION);
+ mIntentFilter.addAction(NOTIFICATION_USER_CLICKED_INTENT_ACTION);
- mContext.registerReceiver(mBroadcastReceiver, mIntentFilter, null, handler);
+ mContext.registerReceiver(mBroadcastReceiver, mIntentFilter, NETWORK_SETTINGS, handler);
configStore.registerStoreData(wifiInjector.makeImsiProtectionExemptionStoreData(
new ImsiProtectionExemptionDataSource()));
@@ -1448,6 +1457,9 @@ public class WifiCarrierInfoManager {
.setStyle(new Notification.BigTextStyle()
.bigText(mResources.getString(
R.string.wifi_suggestion_imsi_privacy_content)))
+ .setContentIntent(getPrivateBroadcast(NOTIFICATION_USER_CLICKED_INTENT_ACTION,
+ Pair.create(EXTRA_CARRIER_NAME, carrierName),
+ Pair.create(EXTRA_CARRIER_ID, carrierId)))
.setDeleteIntent(getPrivateBroadcast(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
Pair.create(EXTRA_CARRIER_NAME, carrierName),
Pair.create(EXTRA_CARRIER_ID, carrierId)))
diff --git a/service/res/values/strings.xml b/service/res/values/strings.xml
index 441ecca15..ae3f1977b 100644
--- a/service/res/values/strings.xml
+++ b/service/res/values/strings.xml
@@ -49,11 +49,11 @@
<string name="wifi_suggestion_action_disallow_app">No thanks</string>
<!-- Notification title for a connection to a SIM-based carrier network without IMSI privacy protection. -->
- <string name="wifi_suggestion_imsi_privacy_title"><xliff:g id="carrierName" example="xxxMobile">%s</xliff:g> wants to auto\u2011connect</string>
+ <string name="wifi_suggestion_imsi_privacy_title">Connect to <xliff:g id="carrierName" example="xxxMobile">%s</xliff:g> Wi\u2011Fi?</string>
<!-- Notification content for a connection to a SIM-based carrier network without IMSI privacy protection.-->
- <string name="wifi_suggestion_imsi_privacy_content">These networks receive a unique ID that can be used to track device location</string>
+ <string name="wifi_suggestion_imsi_privacy_content">These networks receive a SIM ID that can be used to track device location</string>
<!-- Notification action for allowing carrier specified in the notification body.-->
- <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier">Connect anyway</string>
+ <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier">Connect</string>
<!-- Notification action for disallowing carrier specified in the notification body.-->
<string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier">Don\u0027t connect</string>
<!-- Confirmation dialog title for a connection to a SIM-based carrier network without IMSI privacy protection. -->
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java
index 2c1c2ec91..750e8d46b 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java
@@ -19,6 +19,7 @@ package com.android.server.wifi;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION;
+import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_CLICKED_INTENT_ACTION;
import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION;
import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_DISMISSED_INTENT_ACTION;
@@ -166,6 +167,7 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
when(mNotificationBuilder.setTicker(any())).thenReturn(mNotificationBuilder);
when(mNotificationBuilder.setContentTitle(any())).thenReturn(mNotificationBuilder);
when(mNotificationBuilder.setStyle(any())).thenReturn(mNotificationBuilder);
+ when(mNotificationBuilder.setContentIntent(any())).thenReturn(mNotificationBuilder);
when(mNotificationBuilder.setDeleteIntent(any())).thenReturn(mNotificationBuilder);
when(mNotificationBuilder.setShowWhen(anyBoolean())).thenReturn(mNotificationBuilder);
when(mNotificationBuilder.setLocalOnly(anyBoolean())).thenReturn(mNotificationBuilder);
@@ -1538,26 +1540,13 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
verify(mWifiMetrics).addUserApprovalCarrierUiReaction(
WifiCarrierInfoManager.ACTION_USER_ALLOWED_CARRIER, false);
- validateUserApprovalDialog(CARRIER_NAME);
-
- // Simulate user clicking on allow in the dialog.
- ArgumentCaptor<DialogInterface.OnClickListener> clickListenerCaptor =
- ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
- verify(mAlertDialogBuilder, atLeastOnce()).setPositiveButton(
- any(), clickListenerCaptor.capture());
- assertNotNull(clickListenerCaptor.getValue());
- clickListenerCaptor.getValue().onClick(mAlertDialog, 0);
- mLooper.dispatchAll();
- ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- verify(mContext).sendBroadcast(intentCaptor.capture());
- assertEquals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, intentCaptor.getValue().getAction());
verify(mWifiConfigManager).saveToStore(true);
assertTrue(mImsiDataSource.hasNewDataToSerialize());
assertTrue(mWifiCarrierInfoManager
.hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
verify(mListener).onUserAllowed(DATA_CARRIER_ID);
verify(mWifiMetrics).addUserApprovalCarrierUiReaction(
- WifiCarrierInfoManager.ACTION_USER_ALLOWED_CARRIER, true);
+ WifiCarrierInfoManager.ACTION_USER_ALLOWED_CARRIER, false);
}
@Test
@@ -1607,7 +1596,7 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
validateImsiProtectionNotification(CARRIER_NAME);
//Simulate user dismissal the notification
sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
- CARRIER_NAME, DATA_SUBID);
+ CARRIER_NAME, DATA_CARRIER_ID);
verify(mWifiMetrics).addUserApprovalCarrierUiReaction(
WifiCarrierInfoManager.ACTION_USER_DISMISS, false);
reset(mNotificationManger);
@@ -1618,7 +1607,7 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
// As there is notification is active, should not send notification again.
sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
- CARRIER_NAME, DATA_SUBID);
+ CARRIER_NAME, DATA_CARRIER_ID);
verifyNoMoreInteractions(mNotificationManger);
verify(mWifiConfigManager, never()).saveToStore(true);
assertFalse(mImsiDataSource.hasNewDataToSerialize());
@@ -1642,12 +1631,10 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
validateImsiProtectionNotification(CARRIER_NAME);
- // Simulate user clicking on allow in the notification.
- sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
- CARRIER_NAME, DATA_SUBID);
+ // Simulate user clicking on the notification.
+ sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_CLICKED_INTENT_ACTION,
+ CARRIER_NAME, DATA_CARRIER_ID);
verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
- verify(mWifiMetrics).addUserApprovalCarrierUiReaction(
- WifiCarrierInfoManager.ACTION_USER_ALLOWED_CARRIER, false);
validateUserApprovalDialog(CARRIER_NAME);
// Simulate user clicking on disallow in the dialog.
@@ -1685,11 +1672,10 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
validateImsiProtectionNotification(CARRIER_NAME);
- sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
- CARRIER_NAME, DATA_SUBID);
+ // Simulate user clicking on the notification.
+ sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_CLICKED_INTENT_ACTION,
+ CARRIER_NAME, DATA_CARRIER_ID);
verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
- verify(mWifiMetrics).addUserApprovalCarrierUiReaction(
- WifiCarrierInfoManager.ACTION_USER_ALLOWED_CARRIER, false);
validateUserApprovalDialog(CARRIER_NAME);
// Simulate user clicking on dismissal in the dialog.
@@ -1718,6 +1704,45 @@ public class WifiCarrierInfoManagerTest extends WifiBaseTest {
}
@Test
+ public void testSendImsiProtectionExemptionDialogWithUserAllowed() {
+ // Setup carrier without IMSI privacy protection
+ when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
+ .thenReturn(generateTestCarrierConfig(false));
+ ArgumentCaptor<BroadcastReceiver> receiver =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+ verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
+
+ receiver.getValue().onReceive(mContext,
+ new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+ assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+
+ mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+ validateImsiProtectionNotification(CARRIER_NAME);
+ // Simulate user clicking on the notification.
+ sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_CLICKED_INTENT_ACTION,
+ CARRIER_NAME, DATA_CARRIER_ID);
+ verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
+ validateUserApprovalDialog(CARRIER_NAME);
+
+ // Simulate user clicking on allow in the dialog.
+ ArgumentCaptor<DialogInterface.OnClickListener> clickListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
+ verify(mAlertDialogBuilder, atLeastOnce()).setPositiveButton(
+ any(), clickListenerCaptor.capture());
+ assertNotNull(clickListenerCaptor.getValue());
+ clickListenerCaptor.getValue().onClick(mAlertDialog, 0);
+ mLooper.dispatchAll();
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).sendBroadcast(intentCaptor.capture());
+ assertEquals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, intentCaptor.getValue().getAction());
+ verify(mWifiConfigManager).saveToStore(true);
+ assertTrue(mImsiDataSource.hasNewDataToSerialize());
+ verify(mListener).onUserAllowed(DATA_CARRIER_ID);
+ verify(mWifiMetrics).addUserApprovalCarrierUiReaction(
+ WifiCarrierInfoManager.ACTION_USER_ALLOWED_CARRIER, true);
+ }
+
+ @Test
public void testUserDataStoreIsNotLoadedNotificationWillNotBeSent() {
// reset data source to unloaded state.
mImsiDataSource.reset();