Allow firing the LOST_INTERNET intent immediately in config
When config_notifyNoInternetAsDialogWhenHighPriority is on, the LOST_INTERNET notification intent should be fired immediately rather than as a pending intent. Bug: 281970908 Test: Improve test for this in NetworkNotificationManagerTest Change-Id: I88565839a12a1ab4b096f763250944ebaf6c5349
This commit is contained in:
@@ -135,10 +135,17 @@
|
||||
<!-- Whether to cancel network notifications automatically when tapped -->
|
||||
<bool name="config_autoCancelNetworkNotifications">true</bool>
|
||||
|
||||
<!-- When no internet or partial connectivity is detected on a network, and a high priority
|
||||
(heads up) notification would be shown due to the network being explicitly selected,
|
||||
directly show the dialog that would normally be shown when tapping the notification
|
||||
instead of showing the notification. -->
|
||||
<!-- Configuration to let OEMs customize what to do when :
|
||||
• Partial connectivity is detected on the network
|
||||
• No internet is detected on the network, and
|
||||
- the network was explicitly selected
|
||||
- the system is configured to actively prefer bad wifi (see config_activelyPreferBadWifi)
|
||||
The default behavior (false) is to post a notification with a PendingIntent so
|
||||
the user is informed and can act if they wish.
|
||||
Making this true instead will have the system fire the intent immediately instead
|
||||
of showing a notification. OEMs who do this should have some intent receiver
|
||||
listening to the intent and take the action they prefer (e.g. show a dialog,
|
||||
show a customized notification etc). -->
|
||||
<bool name="config_notifyNoInternetAsDialogWhenHighPriority">false</bool>
|
||||
|
||||
<!-- When showing notifications indicating partial connectivity, display the same notifications
|
||||
|
||||
@@ -322,7 +322,8 @@ public class NetworkNotificationManager {
|
||||
|
||||
private boolean maybeNotifyViaDialog(Resources res, NotificationType notifyType,
|
||||
PendingIntent intent) {
|
||||
if (notifyType != NotificationType.NO_INTERNET
|
||||
if (notifyType != NotificationType.LOST_INTERNET
|
||||
&& notifyType != NotificationType.NO_INTERNET
|
||||
&& notifyType != NotificationType.PARTIAL_CONNECTIVITY) {
|
||||
return false;
|
||||
}
|
||||
@@ -432,7 +433,8 @@ public class NetworkNotificationManager {
|
||||
* A notification with a higher number will take priority over a notification with a lower
|
||||
* number.
|
||||
*/
|
||||
private static int priority(NotificationType t) {
|
||||
@VisibleForTesting
|
||||
public static int priority(NotificationType t) {
|
||||
if (t == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ import android.testing.PollingCheck;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -386,14 +387,37 @@ public class NetworkNotificationManagerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotifyNoInternetAsDialogWhenHighPriority() throws Exception {
|
||||
doReturn(true).when(mResources).getBoolean(
|
||||
public void testNotifyNoInternet_asNotification() throws Exception {
|
||||
doTestNotifyNotificationAsDialogWhenHighPriority(false, NO_INTERNET);
|
||||
}
|
||||
@Test
|
||||
public void testNotifyNoInternet_asDialog() throws Exception {
|
||||
doTestNotifyNotificationAsDialogWhenHighPriority(true, NO_INTERNET);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotifyLostInternet_asNotification() throws Exception {
|
||||
doTestNotifyNotificationAsDialogWhenHighPriority(false, LOST_INTERNET);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotifyLostInternet_asDialog() throws Exception {
|
||||
doTestNotifyNotificationAsDialogWhenHighPriority(true, LOST_INTERNET);
|
||||
}
|
||||
|
||||
public void doTestNotifyNotificationAsDialogWhenHighPriority(final boolean configActive,
|
||||
@NonNull final NotificationType notifType) throws Exception {
|
||||
doReturn(configActive).when(mResources).getBoolean(
|
||||
R.bool.config_notifyNoInternetAsDialogWhenHighPriority);
|
||||
|
||||
final Instrumentation instr = InstrumentationRegistry.getInstrumentation();
|
||||
final UiDevice uiDevice = UiDevice.getInstance(instr);
|
||||
final Context ctx = instr.getContext();
|
||||
final PowerManager pm = ctx.getSystemService(PowerManager.class);
|
||||
// If the prio of this notif is < that of NETWORK_SWITCH, it's the lowest prio and
|
||||
// therefore it can't be tested whether it cancels other lower-prio notifs.
|
||||
final boolean isLowestPrioNotif = NetworkNotificationManager.priority(notifType)
|
||||
< NetworkNotificationManager.priority(NETWORK_SWITCH);
|
||||
|
||||
// Wake up the device (it has no effect if the device is already awake).
|
||||
uiDevice.executeShellCommand("input keyevent KEYCODE_WAKEUP");
|
||||
@@ -409,9 +433,13 @@ public class NetworkNotificationManagerTest {
|
||||
uiDevice.wait(Until.hasObject(By.pkg(launcherPackageName)),
|
||||
UI_AUTOMATOR_WAIT_TIME_MILLIS));
|
||||
|
||||
mManager.showNotification(TEST_NOTIF_ID, NETWORK_SWITCH, mWifiNai, mCellNai, null, false);
|
||||
// Non-"no internet" notifications are not affected
|
||||
verify(mNotificationManager).notify(eq(TEST_NOTIF_TAG), eq(NETWORK_SWITCH.eventId), any());
|
||||
if (!isLowestPrioNotif) {
|
||||
mManager.showNotification(TEST_NOTIF_ID, NETWORK_SWITCH, mWifiNai, mCellNai,
|
||||
null, false);
|
||||
// Non-"no internet" notifications are not affected
|
||||
verify(mNotificationManager).notify(eq(TEST_NOTIF_TAG), eq(NETWORK_SWITCH.eventId),
|
||||
any());
|
||||
}
|
||||
|
||||
final String testAction = "com.android.connectivity.coverage.TEST_DIALOG";
|
||||
final Intent intent = new Intent(testAction)
|
||||
@@ -420,22 +448,30 @@ public class NetworkNotificationManagerTest {
|
||||
final PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0 /* requestCode */,
|
||||
intent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
mManager.showNotification(TEST_NOTIF_ID, NO_INTERNET, mWifiNai, null /* switchToNai */,
|
||||
mManager.showNotification(TEST_NOTIF_ID, notifType, mWifiNai, null /* switchToNai */,
|
||||
pendingIntent, true /* highPriority */);
|
||||
|
||||
// Previous notifications are still dismissed
|
||||
verify(mNotificationManager).cancel(TEST_NOTIF_TAG, NETWORK_SWITCH.eventId);
|
||||
if (!isLowestPrioNotif) {
|
||||
// Previous notifications are still dismissed
|
||||
verify(mNotificationManager).cancel(TEST_NOTIF_TAG, NETWORK_SWITCH.eventId);
|
||||
}
|
||||
|
||||
// Verify that the activity is shown (the activity shows the action on screen)
|
||||
final UiObject actionText = uiDevice.findObject(new UiSelector().text(testAction));
|
||||
assertTrue("Activity not shown", actionText.waitForExists(TEST_TIMEOUT_MS));
|
||||
if (configActive) {
|
||||
// Verify that the activity is shown (the activity shows the action on screen)
|
||||
final UiObject actionText = uiDevice.findObject(new UiSelector().text(testAction));
|
||||
assertTrue("Activity not shown", actionText.waitForExists(TEST_TIMEOUT_MS));
|
||||
|
||||
// Tapping the text should dismiss the dialog
|
||||
actionText.click();
|
||||
assertTrue("Activity not dismissed", actionText.waitUntilGone(TEST_TIMEOUT_MS));
|
||||
// Tapping the text should dismiss the dialog
|
||||
actionText.click();
|
||||
assertTrue("Activity not dismissed", actionText.waitUntilGone(TEST_TIMEOUT_MS));
|
||||
|
||||
// Verify no NO_INTERNET notification was posted
|
||||
verify(mNotificationManager, never()).notify(any(), eq(NO_INTERNET.eventId), any());
|
||||
// Verify that the notification was not posted
|
||||
verify(mNotificationManager, never()).notify(any(), eq(notifType.eventId), any());
|
||||
} else {
|
||||
// Notification should have been posted, and will have overridden the previous
|
||||
// one because it has the same id (hence no cancel).
|
||||
verify(mNotificationManager).notify(eq(TEST_NOTIF_TAG), eq(notifType.eventId), any());
|
||||
}
|
||||
}
|
||||
|
||||
private void doNotificationTextTest(NotificationType type, @StringRes int expectedTitleRes,
|
||||
|
||||
Reference in New Issue
Block a user