diff options
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 |