Merge "[TNU08] Remove the "tethering is on" notification" am: 3680357420

Change-Id: I74d7c888f450e7f00000f30c63ff5cf05f6a968a
This commit is contained in:
Paul Hu
2020-04-22 05:51:36 +00:00
committed by Automerger Merge Worker
4 changed files with 39 additions and 351 deletions

View File

@@ -156,51 +156,6 @@
<!-- ComponentName of the service used to run no ui tether provisioning. -->
<string translatable="false" name="config_wifi_tether_enable">com.android.settings/.wifi.tether.TetherService</string>
<!-- Enable tethering notification -->
<!-- Icons for showing tether enable notification.
Each item should have two elements and be separated with ";".
The first element is downstream types which is one of tethering. This element has to be
made by WIFI, USB, BT, and OR'd with the others. Use "|" to combine multiple downstream
types and use "," to separate each combinations. Such as
USB|BT,WIFI|USB|BT
The second element is icon for the item. This element has to be composed by
<package name>:drawable/<resource name>. Such as
1. com.android.networkstack.tethering:drawable/stat_sys_tether_general
2. android:drawable/xxx
So the entire string of each item would be
USB|BT,WIFI|USB|BT;com.android.networkstack.tethering:drawable/stat_sys_tether_general
NOTE: One config can be separated into two or more for readability. Such as
WIFI|USB,WIFI|BT,USB|BT,WIFI|USB|BT;android:drawable/xxx
can be separated into
WIFI|USB;android:drawable/xxx
WIFI|BT;android:drawable/xxx
USB|BT;android:drawable/xxx
WIFI|USB|BT;android:drawable/xxx
Notification will not show if the downstream type isn't listed in array.
Empty array means disable notifications. -->
<!-- In AOSP, hotspot is configured to no notification by default. Because status bar has showed
an icon on the right side already -->
<string-array translatable="false" name="tethering_notification_icons">
<item>USB;com.android.networkstack.tethering:drawable/stat_sys_tether_usb</item>
<item>BT;com.android.networkstack.tethering:drawable/stat_sys_tether_bluetooth</item>
<item>WIFI|USB,WIFI|BT,USB|BT,WIFI|USB|BT;com.android.networkstack.tethering:drawable/stat_sys_tether_general</item>
</string-array>
<!-- String for tether enable notification title. -->
<string name="tethering_notification_title">@string/tethered_notification_title</string>
<!-- String for tether enable notification message. -->
<string name="tethering_notification_message">@string/tethered_notification_message</string>
<!-- No upstream notification is shown when there is a downstream but no upstream that is able
to do the tethering. -->
<!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to

View File

@@ -32,44 +32,6 @@
<item type="string" name="config_mobile_hotspot_provision_response"/>
<item type="integer" name="config_mobile_hotspot_provision_check_period"/>
<item type="string" name="config_wifi_tether_enable"/>
<!-- Configuration values for TetheringNotificationUpdater -->
<!-- Icons for showing tether enable notification.
Each item should have two elements and be separated with ";".
The first element is downstream types which is one of tethering. This element has to be
made by WIFI, USB, BT, and OR'd with the others. Use "|" to combine multiple downstream
types and use "," to separate each combinations. Such as
USB|BT,WIFI|USB|BT
The second element is icon for the item. This element has to be composed by
<package name>:drawable/<resource name>. Such as
1. com.android.networkstack.tethering:drawable/stat_sys_tether_general
2. android:drawable/xxx
So the entire string of each item would be
USB|BT,WIFI|USB|BT;com.android.networkstack.tethering:drawable/stat_sys_tether_general
NOTE: One config can be separated into two or more for readability. Such as
WIFI|USB,WIFI|BT,USB|BT,WIFI|USB|BT;android:drawable/xxx
can be separated into
WIFI|USB;android:drawable/xxx
WIFI|BT;android:drawable/xxx
USB|BT;android:drawable/xxx
WIFI|USB|BT;android:drawable/xxx
Notification will not show if the downstream type isn't listed in array.
Empty array means disable notifications. -->
<item type="array" name="tethering_notification_icons"/>
<!-- String for tether enable notification title. -->
<item type="string" name="tethering_notification_title"/>
<!-- String for tether enable notification message. -->
<item type="string" name="tethering_notification_message"/>
<!-- Params from config.xml that can be overlaid -->
</policy>
</overlayable>

View File

@@ -17,9 +17,6 @@
package com.android.networkstack.tethering;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
import static android.net.TetheringManager.TETHERING_BLUETOOTH;
import static android.net.TetheringManager.TETHERING_USB;
import static android.net.TetheringManager.TETHERING_WIFI;
import static android.text.TextUtils.isEmpty;
import android.app.Notification;
@@ -39,10 +36,8 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.SparseArray;
import androidx.annotation.ArrayRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import androidx.annotation.IntRange;
@@ -77,9 +72,6 @@ public class TetheringNotificationUpdater {
private static final boolean NO_NOTIFY = false;
@VisibleForTesting
static final int EVENT_SHOW_NO_UPSTREAM = 1;
// Id to update and cancel enable notification. Must be unique within the tethering app.
@VisibleForTesting
static final int ENABLE_NOTIFICATION_ID = 1000;
// Id to update and cancel restricted notification. Must be unique within the tethering app.
@VisibleForTesting
static final int RESTRICTED_NOTIFICATION_ID = 1001;
@@ -120,7 +112,6 @@ public class TetheringNotificationUpdater {
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
ENABLE_NOTIFICATION_ID,
RESTRICTED_NOTIFICATION_ID,
NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID
@@ -223,7 +214,6 @@ public class TetheringNotificationUpdater {
final boolean tetheringActiveChanged =
(downstreamTypes == DOWNSTREAM_NONE) != (mDownstreamTypesMask == DOWNSTREAM_NONE);
final boolean subIdChanged = subId != mActiveDataSubId;
final boolean downstreamChanged = downstreamTypes != mDownstreamTypesMask;
final boolean upstreamChanged = noUpstream != mNoUpstream;
final boolean roamingChanged = isRoaming != mRoaming;
final boolean updateAll = tetheringActiveChanged || subIdChanged;
@@ -232,19 +222,10 @@ public class TetheringNotificationUpdater {
mNoUpstream = noUpstream;
mRoaming = isRoaming;
if (updateAll || downstreamChanged) updateEnableNotification();
if (updateAll || upstreamChanged) updateNoUpstreamNotification();
if (updateAll || roamingChanged) updateRoamingNotification();
}
private void updateEnableNotification() {
final boolean tetheringInactive = mDownstreamTypesMask == DOWNSTREAM_NONE;
if (tetheringInactive || setupNotification() == NO_NOTIFY) {
clearNotification(ENABLE_NOTIFICATION_ID);
}
}
private void updateNoUpstreamNotification() {
final boolean tetheringInactive = mDownstreamTypesMask == DOWNSTREAM_NONE;
@@ -310,64 +291,6 @@ public class TetheringNotificationUpdater {
NO_UPSTREAM_NOTIFICATION_ID, null /* pendingIntent */, action);
}
/**
* Returns the downstream types mask which convert from given string.
*
* @param types This string has to be made by "WIFI", "USB", "BT", and OR'd with the others.
*
* @return downstream types mask value.
*/
@VisibleForTesting
@IntRange(from = 0, to = 7)
int getDownstreamTypesMask(@NonNull final String types) {
int downstreamTypesMask = DOWNSTREAM_NONE;
final String[] downstreams = types.split("\\|");
for (String downstream : downstreams) {
if (USB_DOWNSTREAM.equals(downstream.trim())) {
downstreamTypesMask |= (1 << TETHERING_USB);
} else if (WIFI_DOWNSTREAM.equals(downstream.trim())) {
downstreamTypesMask |= (1 << TETHERING_WIFI);
} else if (BLUETOOTH_DOWNSTREAM.equals(downstream.trim())) {
downstreamTypesMask |= (1 << TETHERING_BLUETOOTH);
}
}
return downstreamTypesMask;
}
/**
* Returns the icons {@link android.util.SparseArray} which get from given string-array resource
* id.
*
* @param id String-array resource id
*
* @return {@link android.util.SparseArray} with downstream types and icon id info.
*/
@NonNull
@VisibleForTesting
SparseArray<Integer> getIcons(@ArrayRes int id, @NonNull Resources res) {
final String[] array = res.getStringArray(id);
final SparseArray<Integer> icons = new SparseArray<>();
for (String config : array) {
if (isEmpty(config)) continue;
final String[] elements = config.split(";");
if (elements.length != 2) {
Log.wtf(TAG,
"Unexpected format in Tethering notification configuration : " + config);
continue;
}
final String[] types = elements[0].split(",");
for (String type : types) {
int mask = getDownstreamTypesMask(type);
if (mask == DOWNSTREAM_NONE) continue;
icons.put(mask, res.getIdentifier(
elements[1].trim(), null /* defType */, null /* defPackage */));
}
}
return icons;
}
private boolean setupRoamingNotification() {
final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
final boolean upstreamRoamingNotification =
@@ -403,29 +326,6 @@ public class TetheringNotificationUpdater {
return NOTIFY_DONE;
}
private boolean setupNotification() {
final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
final SparseArray<Integer> downstreamIcons =
getIcons(R.array.tethering_notification_icons, res);
final int iconId = downstreamIcons.get(mDownstreamTypesMask, NO_ICON_ID);
if (iconId == NO_ICON_ID) return NO_NOTIFY;
final String title = res.getString(R.string.tethering_notification_title);
final String message = res.getString(R.string.tethering_notification_message);
if (isEmpty(title) || isEmpty(message)) return NO_NOTIFY;
final PendingIntent pi = PendingIntent.getActivity(
mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */),
0 /* requestCode */,
new Intent(Settings.ACTION_TETHER_SETTINGS),
Intent.FLAG_ACTIVITY_NEW_TASK,
null /* options */);
showNotification(iconId, title, message, ENABLE_NOTIFICATION_ID, pi, new Action[0]);
return NOTIFY_DONE;
}
private void showNotification(@DrawableRes final int iconId, @NonNull final String title,
@NonNull final String message, @NotificationId final int id, @Nullable PendingIntent pi,
@NonNull final Action... actions) {

View File

@@ -20,8 +20,6 @@ import android.app.Notification
import android.app.NotificationManager
import android.content.Context
import android.content.res.Resources
import android.net.ConnectivityManager.TETHERING_BLUETOOTH
import android.net.ConnectivityManager.TETHERING_USB
import android.net.ConnectivityManager.TETHERING_WIFI
import android.os.Handler
import android.os.HandlerThread
@@ -29,14 +27,12 @@ import android.os.Looper
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING
import android.os.UserHandle
import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import android.telephony.TelephonyManager
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import com.android.internal.util.test.BroadcastInterceptingContext
import com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE
import com.android.networkstack.tethering.TetheringNotificationUpdater.ENABLE_NOTIFICATION_ID
import com.android.networkstack.tethering.TetheringNotificationUpdater.EVENT_SHOW_NO_UPSTREAM
import com.android.networkstack.tethering.TetheringNotificationUpdater.NO_UPSTREAM_NOTIFICATION_ID
import com.android.networkstack.tethering.TetheringNotificationUpdater.RESTRICTED_NOTIFICATION_ID
@@ -63,17 +59,9 @@ import org.mockito.Mockito.verifyZeroInteractions
import org.mockito.MockitoAnnotations
const val TEST_SUBID = 1
const val WIFI_ICON_ID = 1
const val USB_ICON_ID = 2
const val BT_ICON_ID = 3
const val GENERAL_ICON_ID = 4
const val WIFI_MASK = 1 shl TETHERING_WIFI
const val USB_MASK = 1 shl TETHERING_USB
const val BT_MASK = 1 shl TETHERING_BLUETOOTH
const val TITLE = "Tethering active"
const val MESSAGE = "Tap here to set up."
const val TEST_TITLE = "Hotspot active"
const val TEST_MESSAGE = "Tap to set up hotspot."
const val TEST_DISALLOW_TITLE = "Tether function is disallowed"
const val TEST_DISALLOW_MESSAGE = "Please contact your admin"
const val TEST_NO_UPSTREAM_TITLE = "Hotspot has no internet access"
const val TEST_NO_UPSTREAM_MESSAGE = "Device cannot connect to internet."
const val TEST_NO_UPSTREAM_BUTTON = "Turn off hotspot"
@@ -88,7 +76,6 @@ class TetheringNotificationUpdaterTest {
@Mock private lateinit var mockContext: Context
@Mock private lateinit var notificationManager: NotificationManager
@Mock private lateinit var telephonyManager: TelephonyManager
@Mock private lateinit var defaultResources: Resources
@Mock private lateinit var testResources: Resources
// lateinit for these classes under test, as they should be reset to a different instance for
@@ -97,11 +84,6 @@ class TetheringNotificationUpdaterTest {
private lateinit var notificationUpdater: TetheringNotificationUpdater
private lateinit var fakeTetheringThread: HandlerThread
private val ENABLE_ICON_CONFIGS = arrayOf(
"USB;android.test:drawable/usb", "BT;android.test:drawable/bluetooth",
"WIFI|BT;android.test:drawable/general", "WIFI|USB;android.test:drawable/general",
"USB|BT;android.test:drawable/general", "WIFI|USB|BT;android.test:drawable/general")
private val ROAMING_CAPABILITIES = NetworkCapabilities()
private val HOME_CAPABILITIES = NetworkCapabilities().addCapability(NET_CAPABILITY_NOT_ROAMING)
private val NOTIFICATION_ICON_ID = R.drawable.stat_sys_tether_general
@@ -117,29 +99,19 @@ class TetheringNotificationUpdaterTest {
private inner class WrappedNotificationUpdater(c: Context, looper: Looper)
: TetheringNotificationUpdater(c, looper) {
override fun getResourcesForSubId(context: Context, subId: Int) =
when (subId) {
TEST_SUBID -> testResources
INVALID_SUBSCRIPTION_ID -> defaultResources
else -> super.getResourcesForSubId(context, subId)
}
override fun getResourcesForSubId(c: Context, subId: Int) =
if (subId == TEST_SUBID) testResources else super.getResourcesForSubId(c, subId)
}
private fun setupResources() {
doReturn(ENABLE_ICON_CONFIGS).`when`(defaultResources)
.getStringArray(R.array.tethering_notification_icons)
doReturn(arrayOf("WIFI;android.test:drawable/wifi")).`when`(testResources)
.getStringArray(R.array.tethering_notification_icons)
doReturn(5).`when`(testResources)
.getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul)
doReturn(true).`when`(testResources)
.getBoolean(R.bool.config_upstream_roaming_notification)
doReturn(TITLE).`when`(defaultResources).getString(R.string.tethering_notification_title)
doReturn(MESSAGE).`when`(defaultResources)
.getString(R.string.tethering_notification_message)
doReturn(TEST_TITLE).`when`(testResources).getString(R.string.tethering_notification_title)
doReturn(TEST_MESSAGE).`when`(testResources)
.getString(R.string.tethering_notification_message)
doReturn(TEST_DISALLOW_TITLE).`when`(testResources)
.getString(R.string.disable_tether_notification_title)
doReturn(TEST_DISALLOW_MESSAGE).`when`(testResources)
.getString(R.string.disable_tether_notification_message)
doReturn(TEST_NO_UPSTREAM_TITLE).`when`(testResources)
.getString(R.string.no_upstream_notification_title)
doReturn(TEST_NO_UPSTREAM_MESSAGE).`when`(testResources)
@@ -150,14 +122,6 @@ class TetheringNotificationUpdaterTest {
.getString(R.string.upstream_roaming_notification_title)
doReturn(TEST_ROAMING_MESSAGE).`when`(testResources)
.getString(R.string.upstream_roaming_notification_message)
doReturn(USB_ICON_ID).`when`(defaultResources)
.getIdentifier(eq("android.test:drawable/usb"), any(), any())
doReturn(BT_ICON_ID).`when`(defaultResources)
.getIdentifier(eq("android.test:drawable/bluetooth"), any(), any())
doReturn(GENERAL_ICON_ID).`when`(defaultResources)
.getIdentifier(eq("android.test:drawable/general"), any(), any())
doReturn(WIFI_ICON_ID).`when`(testResources)
.getIdentifier(eq("android.test:drawable/wifi"), any(), any())
}
@Before
@@ -206,119 +170,27 @@ class TetheringNotificationUpdaterTest {
}
@Test
fun testNotificationWithDownstreamChanged() {
// Wifi downstream. No notification.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID))
// Same downstream changed. Nothing happened.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
verifyZeroInteractions(notificationManager)
// Wifi and usb downstreams. Show enable notification
notificationUpdater.onDownstreamChanged(WIFI_MASK or USB_MASK)
verifyNotification(GENERAL_ICON_ID, TITLE, MESSAGE, ENABLE_NOTIFICATION_ID)
// Usb downstream. Still show enable notification.
notificationUpdater.onDownstreamChanged(USB_MASK)
verifyNotification(USB_ICON_ID, TITLE, MESSAGE, ENABLE_NOTIFICATION_ID)
// No downstream. No notification.
notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
}
@Test
fun testNotificationWithActiveDataSubscriptionIdChanged() {
// Usb downstream. Showed enable notification with default resource.
notificationUpdater.onDownstreamChanged(USB_MASK)
verifyNotification(USB_ICON_ID, TITLE, MESSAGE, ENABLE_NOTIFICATION_ID)
// Same subId changed. Nothing happened.
notificationUpdater.onActiveDataSubscriptionIdChanged(INVALID_SUBSCRIPTION_ID)
verifyZeroInteractions(notificationManager)
// Set test sub id. Clear notification with test resource.
fun testRestrictedNotification() {
// Set test sub id.
notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
// Wifi downstream. Show enable notification with test resource.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
verifyNotification(WIFI_ICON_ID, TEST_TITLE, TEST_MESSAGE, ENABLE_NOTIFICATION_ID)
// No downstream. No notification.
notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
}
private fun assertIconNumbers(number: Int, configs: Array<String?>) {
doReturn(configs).`when`(defaultResources)
.getStringArray(R.array.tethering_notification_icons)
assertEquals(number, notificationUpdater.getIcons(
R.array.tethering_notification_icons, defaultResources).size())
}
@Test
fun testGetIcons() {
assertIconNumbers(0, arrayOfNulls<String>(0))
assertIconNumbers(0, arrayOf(null, ""))
assertIconNumbers(3, arrayOf(
// These configurations are invalid with wrong strings or symbols.
";", ",", "|", "|,;", "WIFI", "1;2", " U SB; ", "bt;", "WIFI;USB;BT", "WIFI|USB|BT",
"WIFI,BT,USB", " WIFI| | | USB, test:drawable/test",
// This configuration is valid with two downstream types (USB, BT).
"USB|,,,,,|BT;drawable/test ",
// This configuration is valid with one downstream types (WIFI).
" WIFI ; android.test:drawable/xxx "))
}
@Test
fun testGetDownstreamTypesMask() {
assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask(""))
assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask("1"))
assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask("WIFI_P2P"))
assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask("usb"))
assertEquals(WIFI_MASK, notificationUpdater.getDownstreamTypesMask(" WIFI "))
assertEquals(USB_MASK, notificationUpdater.getDownstreamTypesMask("USB | B T"))
assertEquals(BT_MASK, notificationUpdater.getDownstreamTypesMask(" WIFI: | BT"))
assertEquals(WIFI_MASK or USB_MASK,
notificationUpdater.getDownstreamTypesMask("1|2|USB|WIFI|BLUETOOTH||"))
}
@Test
fun testSetupRestrictedNotification() {
val title = context.resources.getString(R.string.disable_tether_notification_title)
val message = context.resources.getString(R.string.disable_tether_notification_message)
val disallowTitle = "Tether function is disallowed"
val disallowMessage = "Please contact your admin"
doReturn(title).`when`(defaultResources)
.getString(R.string.disable_tether_notification_title)
doReturn(message).`when`(defaultResources)
.getString(R.string.disable_tether_notification_message)
doReturn(disallowTitle).`when`(testResources)
.getString(R.string.disable_tether_notification_title)
doReturn(disallowMessage).`when`(testResources)
.getString(R.string.disable_tether_notification_message)
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// User restrictions on. Show restricted notification.
notificationUpdater.notifyTetheringDisabledByRestriction()
verifyNotification(NOTIFICATION_ICON_ID, title, message, RESTRICTED_NOTIFICATION_ID)
verifyNotification(NOTIFICATION_ICON_ID, TEST_DISALLOW_TITLE, TEST_DISALLOW_MESSAGE,
RESTRICTED_NOTIFICATION_ID)
// User restrictions off. Clear notification.
notificationUpdater.tetheringRestrictionLifted()
verifyNotificationCancelled(listOf(RESTRICTED_NOTIFICATION_ID))
// Set test sub id. No notification.
notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
// No downstream.
notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
verifyZeroInteractions(notificationManager)
// User restrictions on again. Show restricted notification with test resource.
// User restrictions on again. Show restricted notification.
notificationUpdater.notifyTetheringDisabledByRestriction()
verifyNotification(NOTIFICATION_ICON_ID, disallowTitle, disallowMessage,
verifyNotification(NOTIFICATION_ICON_ID, TEST_DISALLOW_TITLE, TEST_DISALLOW_MESSAGE,
RESTRICTED_NOTIFICATION_ID)
}
@@ -356,15 +228,14 @@ class TetheringNotificationUpdaterTest {
}
@Test
fun testNotificationWithUpstreamCapabilitiesChanged_NoUpstream() {
// Set test sub id. No notification.
fun testNoUpstreamNotification() {
// Set test sub id.
notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// Wifi downstream. Show enable notification with test resource.
// Wifi downstream.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
verifyNotification(WIFI_ICON_ID, TEST_TITLE, TEST_MESSAGE, ENABLE_NOTIFICATION_ID)
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// There is no upstream. Show no upstream notification.
notificationUpdater.onUpstreamCapabilitiesChanged(null)
@@ -386,15 +257,14 @@ class TetheringNotificationUpdaterTest {
verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
NO_UPSTREAM_NOTIFICATION_ID)
// No downstream. No notification.
// No downstream.
notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// Put up enable notification with wifi downstream and home capabilities.
// Wifi downstream and home capabilities.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES)
verifyNotification(WIFI_ICON_ID, TEST_TITLE, TEST_MESSAGE, ENABLE_NOTIFICATION_ID)
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// Set R.integer.delay_to_show_no_upstream_after_no_backhaul to -1 and change to no upstream
// again. Don't put up no upstream notification.
@@ -429,15 +299,14 @@ class TetheringNotificationUpdaterTest {
}
@Test
fun testNotificationWithUpstreamCapabilitiesChanged_Roaming() {
// Set test sub id. Clear notification.
fun testRoamingNotification() {
// Set test sub id.
notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// Wifi downstream. Show enable notification with test resource.
// Wifi downstream.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
verifyNotification(WIFI_ICON_ID, TEST_TITLE, TEST_MESSAGE, ENABLE_NOTIFICATION_ID)
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// Upstream capabilities changed to roaming state. Show roaming notification.
notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES)
@@ -464,14 +333,16 @@ class TetheringNotificationUpdaterTest {
verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
NO_UPSTREAM_NOTIFICATION_ID)
// No downstream. No notification.
// No downstream.
notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
verifyNotificationCancelled(listOf(ENABLE_NOTIFICATION_ID, NO_UPSTREAM_NOTIFICATION_ID,
ROAMING_NOTIFICATION_ID))
verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
// Wifi downstream again. Show enable notification with test resource.
// Wifi downstream again.
notificationUpdater.onDownstreamChanged(WIFI_MASK)
verifyNotification(WIFI_ICON_ID, TEST_TITLE, TEST_MESSAGE, ENABLE_NOTIFICATION_ID)
notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS)
verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID), false)
verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
NO_UPSTREAM_NOTIFICATION_ID)
// Set R.bool.config_upstream_roaming_notification to false and change upstream
// network to roaming state again. No roaming notification.