Merge "Fix SSID in notification for RTL languages" into main

This commit is contained in:
Remi NGUYEN VAN 2025-03-23 18:35:59 -07:00 • committed by Gerrit Code Review
commit e1564ce3c8
2 changed files with 45 additions and 3 deletions

View file

@ -38,6 +38,7 @@ import android.os.Bundle;
import android.os.UserHandle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.BidiFormatter;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
@ -87,6 +88,7 @@ public class NetworkNotificationManager {
// The context is for the current user (system server)
private final Context mContext;
private final Dependencies mDependencies;
private final ConnectivityResources mResources;
private final TelephonyManager mTelephonyManager;
// The notification manager is created from a context for User.ALL, so notifications
@ -96,7 +98,15 @@ public class NetworkNotificationManager {
private final SparseIntArray mNotificationTypeMap;
public NetworkNotificationManager(@NonNull final Context c, @NonNull final TelephonyManager t) {
this(c, t, new Dependencies());
}
@VisibleForTesting
protected NetworkNotificationManager(@NonNull final Context c,
@NonNull final TelephonyManager t,
@NonNull Dependencies dependencies) {
mContext = c;
mDependencies = dependencies;
mTelephonyManager = t;
mNotificationManager =
(NotificationManager) c.createContextAsUser(UserHandle.ALL, 0 /* flags */)
@ -105,6 +115,13 @@ public class NetworkNotificationManager {
mResources = new ConnectivityResources(mContext);
}
@VisibleForTesting
protected static class Dependencies {
public BidiFormatter getBidiFormatter() {
return BidiFormatter.getInstance();
}
}
@VisibleForTesting
protected static int approximateTransportType(NetworkAgentInfo nai) {
return nai.isVPN() ? TRANSPORT_VPN : getFirstTransportType(nai);
@ -174,7 +191,7 @@ public class NetworkNotificationManager {
name = extraInfo;
} else {
final String ssid = WifiInfo.sanitizeSsid(nai.networkCapabilities.getSsid());
name = ssid == null ? "" : ssid;
name = ssid == null ? "" : mDependencies.getBidiFormatter().unicodeWrap(ssid);
}
// Only notify for Internet-capable networks.
if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_INTERNET)) return;

View file

@ -27,6 +27,7 @@ import static com.android.server.connectivity.NetworkNotificationManager.Notific
import static com.android.server.connectivity.NetworkNotificationManager.NotificationType.SIGN_IN;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
@ -61,6 +62,7 @@ import android.os.PowerManager;
import android.os.UserHandle;
import android.telephony.TelephonyManager;
import android.testing.PollingCheck;
import android.text.BidiFormatter;
import android.util.DisplayMetrics;
import android.util.Log;
import android.widget.TextView;
@ -95,13 +97,14 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
@RunWith(DevSdkIgnoreRunner.class)
@SmallTest
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
public class NetworkNotificationManagerTest {
private static final String TEST_SSID = "Test SSID";
private static final String TEST_SSID = "?Test SSID+";
private static final String TEST_EXTRA_INFO = "extra";
private static final int TEST_NOTIF_ID = 101;
private static final String TEST_NOTIF_TAG = NetworkNotificationManager.tagFor(TEST_NOTIF_ID);
@ -166,6 +169,7 @@ public class NetworkNotificationManagerTest {
@Mock NetworkAgentInfo mBluetoothNai;
@Mock NetworkInfo mNetworkInfo;
@Mock NetworkInfo mEmptyNetworkInfo;
@Mock NetworkNotificationManager.Dependencies mDependencies;
ArgumentCaptor<Notification> mCaptor;
NetworkNotificationManager mManager;
@ -192,6 +196,7 @@ public class NetworkNotificationManagerTest {
doReturn(asUserCtx).when(mCtx).createContextAsUser(eq(UserHandle.ALL), anyInt());
doReturn(mNotificationManager).when(mCtx)
.getSystemService(eq(Context.NOTIFICATION_SERVICE));
doReturn(BidiFormatter.getInstance(Locale.US)).when(mDependencies).getBidiFormatter();
doReturn(TEST_EXTRA_INFO).when(mNetworkInfo).getExtraInfo();
ConnectivityResources.setResourcesContextForTest(mCtx);
doReturn(0xFF607D8B).when(mResources).getColor(anyInt(), any());
@ -209,7 +214,7 @@ public class NetworkNotificationManagerTest {
.thenReturn(transportNames);
when(mResources.getBoolean(R.bool.config_autoCancelNetworkNotifications)).thenReturn(true);
mManager = new NetworkNotificationManager(mCtx, mTelephonyManager);
mManager = new NetworkNotificationManager(mCtx, mTelephonyManager, mDependencies);
}
@After
@ -534,6 +539,26 @@ public class NetworkNotificationManagerTest {
R.string.wifi_no_internet_detailed);
}
@Test
public void testNotificationText_NoInternet_WithSsid() {
doReturn(null).when(mNetworkInfo).getExtraInfo();
doNotificationTextTest(NO_INTERNET,
R.string.wifi_no_internet, TEST_SSID,
R.string.wifi_no_internet_detailed);
}
@Test
public void testNotificationText_NoInternet_WithRtlSsid() {
final BidiFormatter formatter = BidiFormatter.getInstance(Locale.forLanguageTag("ar"));
final String wrappedString = formatter.unicodeWrap(TEST_SSID);
doReturn(formatter).when(mDependencies).getBidiFormatter();
doReturn(null).when(mNetworkInfo).getExtraInfo();
assertNotEquals(TEST_SSID, wrappedString);
doNotificationTextTest(NO_INTERNET,
R.string.wifi_no_internet, wrappedString,
R.string.wifi_no_internet_detailed);
}
@Test
public void testNotificationText_Partial() {
doNotificationTextTest(PARTIAL_CONNECTIVITY,