summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java27
-rw-r--r--service/java/com/android/server/wifi/ConnectionFailureNotifier.java98
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java3
-rw-r--r--service/tests/wifitests/src/com/android/server/wifi/ConnectionFailureNotifierTest.java44
4 files changed, 89 insertions, 83 deletions
diff --git a/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java b/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java
index 52f72892a5..aa062a8467 100644
--- a/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java
+++ b/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java
@@ -17,15 +17,12 @@
package com.android.server.wifi;
import android.annotation.NonNull;
-import android.app.AlertDialog;
import android.app.Notification;
import android.app.PendingIntent;
-import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiContext;
-import android.view.WindowManager;
import com.android.wifi.resources.R;
@@ -88,28 +85,4 @@ public class ConnectionFailureNotificationBuilder {
.setAutoCancel(true)
.build();
}
-
- /**
- * Creates an AlertDialog that allows the user to disable MAC randomization for a network.
- * @param ssid the displayed SSID in the dialog
- * @param onUserConfirm
- */
- public AlertDialog buildChangeMacRandomizationSettingDialog(
- String ssid, DialogInterface.OnClickListener onUserConfirm) {
- AlertDialog.Builder builder = mFrameworkFacade.makeAlertDialogBuilder(mContext)
- .setTitle(mContext.getResources().getString(
- R.string.wifi_disable_mac_randomization_dialog_title))
- .setMessage(mContext.getResources().getString(
- R.string.wifi_disable_mac_randomization_dialog_message, ssid))
- .setPositiveButton(
- mContext.getResources().getString(
- R.string.wifi_disable_mac_randomization_dialog_confirm_text),
- onUserConfirm)
- // A null listener allows the dialog to be dismissed directly.
- .setNegativeButton(android.R.string.no, null);
- AlertDialog dialog = builder.create();
- dialog.setCanceledOnTouchOutside(false);
- dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- return dialog;
- }
}
diff --git a/service/java/com/android/server/wifi/ConnectionFailureNotifier.java b/service/java/com/android/server/wifi/ConnectionFailureNotifier.java
index 447b10412b..e86c0566c0 100644
--- a/service/java/com/android/server/wifi/ConnectionFailureNotifier.java
+++ b/service/java/com/android/server/wifi/ConnectionFailureNotifier.java
@@ -16,13 +16,12 @@
package com.android.server.wifi;
-import android.app.AlertDialog;
import android.app.Notification;
import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.res.Resources;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiContext;
import android.os.Handler;
@@ -43,6 +42,7 @@ public class ConnectionFailureNotifier {
private final WifiConfigManager mWifiConfigManager;
private final WifiConnectivityManager mWifiConnectivityManager;
private final WifiNotificationManager mNotificationManager;
+ private final WifiDialogManager mWifiDialogManager;
private final Handler mHandler;
private final ConnectionFailureNotificationBuilder mConnectionFailureNotificationBuilder;
@@ -53,12 +53,14 @@ public class ConnectionFailureNotifier {
WifiConnectivityManager wifiConnectivityManager,
Handler handler,
WifiNotificationManager notificationManager,
- ConnectionFailureNotificationBuilder connectionFailureNotificationBuilder) {
+ ConnectionFailureNotificationBuilder connectionFailureNotificationBuilder,
+ WifiDialogManager wifiDialogManager) {
mContext = context;
mFrameworkFacade = framework;
mWifiConfigManager = wifiConfigManager;
mWifiConnectivityManager = wifiConnectivityManager;
mNotificationManager = notificationManager;
+ mWifiDialogManager = wifiDialogManager;
mHandler = handler;
mConnectionFailureNotificationBuilder = connectionFailureNotificationBuilder;
@@ -101,61 +103,71 @@ public class ConnectionFailureNotifier {
notification);
}
- class DisableMacRandomizationListener implements DialogInterface.OnClickListener {
- private WifiConfiguration mConfig;
-
- DisableMacRandomizationListener(WifiConfiguration config) {
- mConfig = config;
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- mHandler.post(() -> {
- mConfig.macRandomizationSetting =
- WifiConfiguration.RANDOMIZATION_NONE;
- mWifiConfigManager.addOrUpdateNetwork(mConfig, Process.SYSTEM_UID);
- WifiConfiguration updatedConfig =
- mWifiConfigManager.getConfiguredNetwork(mConfig.networkId);
- if (updatedConfig.macRandomizationSetting
- == WifiConfiguration.RANDOMIZATION_NONE) {
- String message = mContext.getResources().getString(
- R.string.wifi_disable_mac_randomization_dialog_success);
- mFrameworkFacade.showToast(mContext, message);
- mWifiConfigManager.enableNetwork(updatedConfig.networkId, true,
- Process.SYSTEM_UID, null);
- mWifiConnectivityManager.forceConnectivityScan(
- ClientModeImpl.WIFI_WORK_SOURCE);
- } else {
- // Shouldn't ever fail, but here for completeness
- String message = mContext.getResources().getString(
- R.string.wifi_disable_mac_randomization_dialog_failure);
- mFrameworkFacade.showToast(mContext, message);
- Log.e(TAG, "Failed to modify mac randomization setting");
- }
- });
- }
- }
-
/**
* Class to show a AlertDialog which notifies the user of a network not being privacy
* compliant and then suggests an action.
*/
private void showRandomizationSettingsDialog(int networkId, String ssidAndSecurityType) {
+ Resources res = mContext.getResources();
WifiConfiguration config = mWifiConfigManager.getConfiguredNetwork(networkId);
// Make sure the networkId is still pointing to the correct WifiConfiguration since
// there might be a large time gap between when the notification shows and when
// it's tapped.
if (config == null || ssidAndSecurityType == null
|| !ssidAndSecurityType.equals(config.getSsidAndSecurityTypeString())) {
- String message = mContext.getResources().getString(
+ String message = res.getString(
R.string.wifi_disable_mac_randomization_dialog_network_not_found);
mFrameworkFacade.showToast(mContext, message);
return;
}
- AlertDialog dialog = mConnectionFailureNotificationBuilder
- .buildChangeMacRandomizationSettingDialog(config.SSID,
- new DisableMacRandomizationListener(config));
- dialog.show();
+ mWifiDialogManager.createSimpleDialog(
+ res.getString(R.string.wifi_disable_mac_randomization_dialog_title),
+ res.getString(R.string.wifi_disable_mac_randomization_dialog_message, config.SSID),
+ res.getString(R.string.wifi_disable_mac_randomization_dialog_confirm_text),
+ res.getString(android.R.string.cancel),
+ null /* neutralButtonText */,
+ new WifiDialogManager.SimpleDialogCallback() {
+ @Override
+ public void onPositiveButtonClicked() {
+ config.macRandomizationSetting =
+ WifiConfiguration.RANDOMIZATION_NONE;
+ mWifiConfigManager.addOrUpdateNetwork(config, Process.SYSTEM_UID);
+ WifiConfiguration updatedConfig =
+ mWifiConfigManager.getConfiguredNetwork(config.networkId);
+ if (updatedConfig.macRandomizationSetting
+ == WifiConfiguration.RANDOMIZATION_NONE) {
+ String message = mContext.getResources().getString(
+ R.string.wifi_disable_mac_randomization_dialog_success);
+ mFrameworkFacade.showToast(mContext, message);
+ mWifiConfigManager.enableNetwork(updatedConfig.networkId, true,
+ Process.SYSTEM_UID, null);
+ mWifiConnectivityManager.forceConnectivityScan(
+ ClientModeImpl.WIFI_WORK_SOURCE);
+ } else {
+ // Shouldn't ever fail, but here for completeness
+ String message = mContext.getResources().getString(
+ R.string.wifi_disable_mac_randomization_dialog_failure);
+ mFrameworkFacade.showToast(mContext, message);
+ Log.e(TAG, "Failed to modify mac randomization setting");
+ }
+ }
+
+ @Override
+ public void onNegativeButtonClicked() {
+ // Do nothing.
+ }
+
+ @Override
+ public void onNeutralButtonClicked() {
+ // Not used.
+ }
+
+ @Override
+ public void onCancelled() {
+ // Do nothing.
+ }
+ },
+ new WifiThreadRunner(mHandler)).launchDialog();
}
}
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 91c58352f3..52192b78b3 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -479,7 +479,8 @@ public class WifiInjector {
mConnectionFailureNotifier = new ConnectionFailureNotifier(
mContext, mFrameworkFacade, mWifiConfigManager,
mWifiConnectivityManager, wifiHandler,
- mWifiNotificationManager, mConnectionFailureNotificationBuilder);
+ mWifiNotificationManager, mConnectionFailureNotificationBuilder,
+ mWifiDialogManager);
mWifiNetworkFactory = new WifiNetworkFactory(
wifiLooper, mContext, REGULAR_NETWORK_CAPABILITIES_FILTER,
(ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE),
diff --git a/service/tests/wifitests/src/com/android/server/wifi/ConnectionFailureNotifierTest.java b/service/tests/wifitests/src/com/android/server/wifi/ConnectionFailureNotifierTest.java
index a55461c908..3376523dbc 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/ConnectionFailureNotifierTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/ConnectionFailureNotifierTest.java
@@ -17,11 +17,18 @@
package com.android.server.wifi;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.argThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
-import android.app.AlertDialog;
import android.app.Notification;
import android.content.BroadcastReceiver;
import android.content.DialogInterface;
@@ -36,6 +43,7 @@ import android.os.test.TestLooper;
import androidx.test.filters.SmallTest;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.wifi.resources.R;
import org.junit.Before;
import org.junit.Test;
@@ -55,9 +63,10 @@ public class ConnectionFailureNotifierTest extends WifiBaseTest {
@Mock private WifiConfigManager mWifiConfigManager;
@Mock private WifiConnectivityManager mWifiConnectivityManager;
@Mock private WifiNotificationManager mWifiNotificationManager;
+ @Mock private WifiDialogManager mWifiDialogManager;
@Mock private ConnectionFailureNotificationBuilder mConnectionFailureNotificationBuilder;
@Mock private Notification mNotification;
- @Mock private AlertDialog mAlertDialog;
+ @Mock private WifiDialogManager.DialogHandle mDialogHandle;
private final ArgumentCaptor<BroadcastReceiver> mBroadCastReceiverCaptor =
ArgumentCaptor.forClass(BroadcastReceiver.class);
@@ -73,12 +82,15 @@ public class ConnectionFailureNotifierTest extends WifiBaseTest {
when(mContext.getResources()).thenReturn(mResources);
when(mConnectionFailureNotificationBuilder
.buildNoMacRandomizationSupportNotification(any())).thenReturn(mNotification);
- when(mConnectionFailureNotificationBuilder.buildChangeMacRandomizationSettingDialog(any(),
- any())).thenReturn(mAlertDialog);
+ when(mWifiDialogManager.createSimpleDialog(any(), any(), any(), any(), any(), any(), any()))
+ .thenReturn(mDialogHandle);
mConnectionFailureNotifier = new ConnectionFailureNotifier(
mContext, mFrameworkFacade, mWifiConfigManager, mWifiConnectivityManager,
new Handler(mLooper.getLooper()), mWifiNotificationManager,
- mConnectionFailureNotificationBuilder);
+ mConnectionFailureNotificationBuilder, mWifiDialogManager);
+ when(mResources.getString(
+ eq(R.string.wifi_disable_mac_randomization_dialog_message), anyString()))
+ .thenAnswer(s -> "blah" + s.getArguments()[1]);
verify(mContext).registerReceiver(mBroadCastReceiverCaptor.capture(), any());
}
@@ -130,12 +142,19 @@ public class ConnectionFailureNotifierTest extends WifiBaseTest {
ArgumentCaptor<DialogInterface.OnClickListener> onClickListenerArgumentCaptor =
ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
mBroadCastReceiverCaptor.getValue().onReceive(mContext, intent);
- verify(mConnectionFailureNotificationBuilder).buildChangeMacRandomizationSettingDialog(
- eq(config.SSID), onClickListenerArgumentCaptor.capture());
+ ArgumentCaptor<WifiDialogManager.SimpleDialogCallback> dialogCallbackCaptor =
+ ArgumentCaptor.forClass(WifiDialogManager.SimpleDialogCallback.class);
+ ArgumentCaptor<String> messageCaptor = ArgumentCaptor.forClass(String.class);
+ verify(mDialogHandle).launchDialog();
+ verify(mWifiDialogManager).createSimpleDialog(
+ any(), messageCaptor.capture(), any(), any(), any(),
+ dialogCallbackCaptor.capture(), any());
+ String message = messageCaptor.getValue();
+ assertNotNull(message);
+ assertTrue(message.contains(config.SSID));
// simulate the user tapping on the option to reset MAC address to factory MAC
- onClickListenerArgumentCaptor.getValue().onClick(null, 0);
- mLooper.dispatchAll();
+ dialogCallbackCaptor.getValue().onPositiveButtonClicked();
// verify the WifiConfiguration is updated properly.
verify(mWifiConfigManager).addOrUpdateNetwork(
@@ -167,8 +186,9 @@ public class ConnectionFailureNotifierTest extends WifiBaseTest {
mBroadCastReceiverCaptor.getValue().onReceive(mContext, intent);
// verify that the AlertDialog is not launched in this case
- verify(mConnectionFailureNotificationBuilder, never())
- .buildChangeMacRandomizationSettingDialog(any(), any());
+ verify(mWifiDialogManager, never())
+ .createSimpleDialog(any(), any(), any(), any(), any(), any(), any());
+ verify(mDialogHandle, never()).launchDialog();
verify(mFrameworkFacade, never()).makeAlertDialogBuilder(any());
// instead we are showings a toast due to failing to find the network