diff options
author | Matt Walliser <mattwalliser@google.com> | 2023-11-30 21:28:31 +0000 |
---|---|---|
committer | Matt Walliser <mattwalliser@google.com> | 2023-12-01 23:54:40 +0000 |
commit | b114787398edf5b0303c940d053bd9f4a0b752e6 (patch) | |
tree | 5a87d49f7d53af3837f81d65902b6b77d6772e60 | |
parent | 842b89a9def5dad1fa5b52f218e0b50d720e2a8f (diff) | |
download | wifi-b114787398edf5b0303c940d053bd9f4a0b752e6.tar.gz |
Display error strings in wifi pickers.
Bug: 309968020
Test: atest com.android.wifitrackerlib.HotspotNetworkEntryTest
Change-Id: Id2f3114da2dc0bfa9a60a5ce46bb9488dbc88105
3 files changed, 319 insertions, 5 deletions
diff --git a/libs/WifiTrackerLib/res/values/strings.xml b/libs/WifiTrackerLib/res/values/strings.xml index 39d0332bf..5be3c7d7c 100644 --- a/libs/WifiTrackerLib/res/values/strings.xml +++ b/libs/WifiTrackerLib/res/values/strings.xml @@ -131,6 +131,25 @@ other {{NETWORK_NAME} from your device} }</string> + <!-- Summary for a hotspot network with generic error [CHAR LIMIT=NONE] --> + <string name="wifitrackerlib_hotspot_network_summary_error_generic">Can\'t connect. Try connecting again.</string> + + <!-- Summary for a hotspot network with settings related error [CHAR LIMIT=NONE] --> + <string name="wifitrackerlib_hotspot_network_summary_error_settings">{DEVICE_TYPE, select, + PHONE {Can\'t connect. Check phone settings and try again.} + TABLET {Can\'t connect. Check tablet settings and try again.} + COMPUTER {Can\'t connect. Check computer settings and try again.} + WATCH {Can\'t connect. Check watch settings and try again.} + VEHICLE {Can\'t connect. Check vehicle settings and try again.} + other {Can\'t connect. Check device settings and try again.} + }</string> + + <!-- Summary for a hotspot network with carrier entitlement block error [CHAR LIMIT=NONE] --> + <string name="wifitrackerlib_hotspot_network_summary_error_carrier_block"><xliff:g id="network name" example="Google Fi">%1$s</xliff:g> doesn\'t allow this connection</string> + + <!-- Summary for a hotspot network with carrier entitlement incomplete error [CHAR LIMIT=NONE] --> + <string name="wifitrackerlib_hotspot_network_summary_error_carrier_incomplete">Can\'t connect. Contact <xliff:g id="network name" example="Google Fi">%1$s</xliff:g> for help.</string> + <!-- Alternate summary for a hotspot network (used on "Network & internet" page) [CHAR LIMIT=NONE] --> <string name="wifitrackerlib_hotspot_network_alternate"><xliff:g id="network name" example="Google Fi">%1$s</xliff:g> from <xliff:g id="device name" example="Matt's Phone">%2$s</xliff:g></string> diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java index cccb6dea7..67aca3dec 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java @@ -59,15 +59,20 @@ import java.util.Objects; public class HotspotNetworkEntry extends WifiEntry { static final String TAG = "HotspotNetworkEntry"; public static final String KEY_PREFIX = "HotspotNetworkEntry:"; - public static final String EXTRA_KEY_IS_BATTERY_CHARGING = "is_battery_charging"; + private static final String DEVICE_TYPE_KEY = "DEVICE_TYPE"; + private static final String NETWORK_NAME_KEY = "NETWORK_NAME"; + @NonNull private final WifiTrackerInjector mInjector; @NonNull private final Context mContext; @Nullable private final SharedConnectivityManager mSharedConnectivityManager; @Nullable private HotspotNetwork mHotspotNetworkData; @NonNull private HotspotNetworkEntryKey mKey; + @ConnectionStatus + private int mLastStatus = HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN; + private boolean mConnectionError = false; /** * If editing this IntDef also edit the definition in: @@ -215,12 +220,41 @@ public class HotspotNetworkEntry extends WifiEntry { if (mCalledConnect) { return mContext.getString(R.string.wifitrackerlib_hotspot_network_connecting); } + if (mConnectionError) { + switch (mLastStatus) { + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_PROVISIONING_FAILED: + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT: + return mContext.getString( + R.string.wifitrackerlib_hotspot_network_summary_error_carrier_incomplete, + BidiFormatter.getInstance().unicodeWrap( + mHotspotNetworkData.getNetworkName())); + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_UNSUPPORTED: + return mContext.getString( + R.string.wifitrackerlib_hotspot_network_summary_error_carrier_block, + BidiFormatter.getInstance().unicodeWrap( + mHotspotNetworkData.getNetworkName())); + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_NO_CELL_DATA: + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_FAILED: + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_TIMEOUT: + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED: + MessageFormat msg = new MessageFormat(mContext.getString( + R.string.wifitrackerlib_hotspot_network_summary_error_settings)); + Map<String, Object> args = new HashMap<>(); + args.put(DEVICE_TYPE_KEY, getDeviceTypeId( + mHotspotNetworkData.getNetworkProviderInfo().getDeviceType())); + return msg.format(args); + case HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR: + default: + return mContext.getString( + R.string.wifitrackerlib_hotspot_network_summary_error_generic); + } + } MessageFormat msg = new MessageFormat( mContext.getString(R.string.wifitrackerlib_hotspot_network_summary_new)); Map<String, Object> args = new HashMap<>(); - args.put("DEVICE_TYPE", + args.put(DEVICE_TYPE_KEY, getDeviceTypeId(mHotspotNetworkData.getNetworkProviderInfo().getDeviceType())); - args.put("NETWORK_NAME", mHotspotNetworkData.getNetworkName()); + args.put(NETWORK_NAME_KEY, mHotspotNetworkData.getNetworkName()); return msg.format(args); } @@ -392,6 +426,7 @@ public class HotspotNetworkEntry extends WifiEntry { @Override public synchronized void disconnect(@Nullable DisconnectCallback callback) { + mCalledDisconnect = true; mDisconnectCallback = callback; if (mSharedConnectivityManager == null) { if (callback != null) { @@ -413,9 +448,11 @@ public class HotspotNetworkEntry extends WifiEntry { * @param status HotspotNetworkConnectionStatus#ConnectionStatus enum. */ public void onConnectionStatusChanged(@ConnectionStatus int status) { + mLastStatus = status; switch (status) { case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT: mCalledConnect = true; + mConnectionError = false; notifyOnUpdated(); break; case HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR: @@ -434,6 +471,7 @@ public class HotspotNetworkEntry extends WifiEntry { } }); mCalledConnect = false; + mConnectionError = true; notifyOnUpdated(); break; case CONNECTION_STATUS_CONNECTED: @@ -445,6 +483,7 @@ public class HotspotNetworkEntry extends WifiEntry { } }); mCalledConnect = false; + mConnectionError = false; notifyOnUpdated(); break; default: diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java index a664a92d2..dedf4af01 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java @@ -126,9 +126,31 @@ public class HotspotNetworkEntryTest { + "from your computer} WATCH {{NETWORK_NAME} from your watch} " + "VEHICLE {{NETWORK_NAME} from your vehicle} other " + "{{NETWORK_NAME} from your device}}"); + when(mMockContext.getString(R.string.wifitrackerlib_hotspot_network_summary_error_generic)) + .thenReturn("Can't connect. Try connecting again."); + when(mMockContext.getString(R.string.wifitrackerlib_hotspot_network_summary_error_settings)) + .thenReturn( + "{DEVICE_TYPE, select, PHONE {Can't connect. Check phone settings and try" + + " again.} TABLET {Can't connect. Check tablet settings and try " + + "again.} COMPUTER {Can't connect. Check computer settings and " + + "try again.} WATCH {Can't connect. Check watch settings and try" + + " again.} VEHICLE {Can't connect. Check vehicle settings and " + + "try again.} other {Can't connect. Check device settings and " + + "try again.}}"); + when(mMockContext.getString( + eq(R.string.wifitrackerlib_hotspot_network_summary_error_carrier_block), + anyString())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + return args[1] + " doesn't allow this connection"; + }); + when(mMockContext.getString( + eq(R.string.wifitrackerlib_hotspot_network_summary_error_carrier_incomplete), + anyString())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + return "Can't connect. Contact " + args[1] + " for help."; + }); when(mMockContext.getString(eq(R.string.wifitrackerlib_hotspot_network_alternate), - anyString(), anyString())) - .thenAnswer(invocation -> { + anyString(), anyString())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); return args[1] + " from " + args[2]; }); @@ -845,4 +867,238 @@ public class HotspotNetworkEntryTest { verify(mMockConnectCallback) .onConnectResult(WifiEntry.ConnectCallback.CONNECT_STATUS_SUCCESS); } + + @Test + public void testGetSummary_connectionStatusFailureGeneric_displaysErrorInSummary() { + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo("Can't connect. Try connecting again."); + } + + @Test + public void testGetSummary_connectionStatusFailureSettings_phone_displaysErrorInSummary() { + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo( + "Can't connect. Check phone settings and try again."); + } + + @Test + public void testGetSummary_connectionStatusFailureSettings_tablet_displaysErrorInSummary() { + HotspotNetwork testNetwork = new HotspotNetwork.Builder() + .setDeviceId(1) + .setNetworkProviderInfo(new NetworkProviderInfo + .Builder("My Pixel", "Pixel 7") + .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_TABLET) + .setBatteryPercentage(100) + .setConnectionStrength(3) + .build()) + .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR) + .setNetworkName("Google Fi") + .setHotspotSsid("Instant Hotspot abcde") + .addHotspotSecurityType(SECURITY_TYPE_PSK) + .build(); + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, testNetwork); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo( + "Can't connect. Check tablet settings and try again."); + } + + @Test + public void testGetSummary_connectionStatusFailureSettings_computer_displaysErrorInSummary() { + HotspotNetwork testNetwork = new HotspotNetwork.Builder() + .setDeviceId(1) + .setNetworkProviderInfo(new NetworkProviderInfo + .Builder("My Pixel", "Pixel 7") + .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_LAPTOP) + .setBatteryPercentage(100) + .setConnectionStrength(3) + .build()) + .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR) + .setNetworkName("Google Fi") + .setHotspotSsid("Instant Hotspot abcde") + .addHotspotSecurityType(SECURITY_TYPE_PSK) + .build(); + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, testNetwork); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo( + "Can't connect. Check computer settings and try again."); + } + + @Test + public void testGetSummary_connectionStatusFailureSettings_watch_displaysErrorInSummary() { + HotspotNetwork testNetwork = new HotspotNetwork.Builder() + .setDeviceId(1) + .setNetworkProviderInfo(new NetworkProviderInfo + .Builder("My Pixel", "Pixel 7") + .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_WATCH) + .setBatteryPercentage(100) + .setConnectionStrength(3) + .build()) + .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR) + .setNetworkName("Google Fi") + .setHotspotSsid("Instant Hotspot abcde") + .addHotspotSecurityType(SECURITY_TYPE_PSK) + .build(); + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, testNetwork); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo( + "Can't connect. Check watch settings and try again."); + } + + @Test + public void testGetSummary_connectionStatusFailureSettings_vehicle_displaysErrorInSummary() { + HotspotNetwork testNetwork = new HotspotNetwork.Builder() + .setDeviceId(1) + .setNetworkProviderInfo(new NetworkProviderInfo + .Builder("My Pixel", "Pixel 7") + .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_AUTO) + .setBatteryPercentage(100) + .setConnectionStrength(3) + .build()) + .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR) + .setNetworkName("Google Fi") + .setHotspotSsid("Instant Hotspot abcde") + .addHotspotSecurityType(SECURITY_TYPE_PSK) + .build(); + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, testNetwork); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo( + "Can't connect. Check vehicle settings and try again."); + } + + @Test + public void testGetSummary_connectionStatusFailureSettings_unknown_displaysErrorInSummary() { + HotspotNetwork testNetwork = new HotspotNetwork.Builder() + .setDeviceId(1) + .setNetworkProviderInfo(new NetworkProviderInfo + .Builder("My Pixel", "Pixel 7") + .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_UNKNOWN) + .setBatteryPercentage(100) + .setConnectionStrength(3) + .build()) + .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR) + .setNetworkName("Google Fi") + .setHotspotSsid("Instant Hotspot abcde") + .addHotspotSecurityType(SECURITY_TYPE_PSK) + .build(); + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, testNetwork); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo( + "Can't connect. Check device settings and try again."); + } + + @Test + public void testGetSummary_connectionStatusFailureCarrierBlock_displaysErrorInSummary() { + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_UNSUPPORTED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo("Google Fi doesn't allow this connection"); + } + + @Test + public void testGetSummary_connectionStatusFailureCarrierIncomplete_displaysErrorInSummary() { + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA); + entry.setListener(mMockListener); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isEqualTo("Can't connect. Contact Google Fi for help."); + } + + @Test + public void testGetSummary_connectionStatusConnecting_resetsErrorString() { + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA); + entry.setListener(mMockListener); + entry.connect(mMockConnectCallback); + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR); + mTestLooper.dispatchAll(); + assertThat(entry.getSummary()).isEqualTo("Can't connect. Try connecting again."); + + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isNotEqualTo("Can't connect. Try connecting again."); + } + + @Test + public void testGetSummary_connectionStatusConnected_resetsErrorString() { + final HotspotNetworkEntry entry = new HotspotNetworkEntry( + mMockInjector, mMockContext, mTestHandler, + mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA); + entry.setListener(mMockListener); + entry.connect(mMockConnectCallback); + entry.onConnectionStatusChanged( + HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR); + mTestLooper.dispatchAll(); + assertThat(entry.getSummary()).isEqualTo("Can't connect. Try connecting again."); + + entry.onConnectionStatusChanged(HotspotNetworkEntry.CONNECTION_STATUS_CONNECTED); + mTestLooper.dispatchAll(); + + assertThat(entry.getSummary()).isNotEqualTo("Can't connect. Try connecting again."); + } } |