Merge changes from topic "jr_device" into sc-dev

* changes:
  Update NLS listing page
  Add device list to NLS pages
  Add icons to NLS mgmt page
This commit is contained in:
TreeHugger Robot
2021-03-05 01:02:02 +00:00
committed by Android (Google) Code Review
9 changed files with 238 additions and 39 deletions

View File

@@ -14,28 +14,13 @@ Copyright (C) 2019 The Android Open Source Project
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
<item android:width="24dp"
android:id="@+id/back"> android:height="24dp"
<shape android:shape="oval">
<solid
android:color="@color/notification_silence_color" />
<size
android:height="24dp"
android:width="24dp"/>
</shape>
</item>
<item
android:id="@+id/fore"
android:gravity="center">
<vector
android:width="13dp"
android:height="13dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24"
<path android:tint="?android:attr/colorControlNormal">
android:fillColor="#FFFFFFFF" <path
android:pathData="M15,14.5c-1.38,0 -2.5,-1.12 -2.5,-2.5c0,-0.28 -0.22,-0.5 -0.5,-0.5s-0.5,0.22 -0.5,0.5c0,1.38 -1.12,2.5 -2.5,2.5S6.5,13.38 6.5,12c0,-0.28 -0.22,-0.5 -0.5,-0.5c-0.24,0 -0.46,0.18 -0.49,0.42C5.41,12.55 4.89,13 4.27,13H2v-2h1.71C4.1,10.11 5,9.5 6,9.5c1.38,0 2.5,1.12 2.5,2.5c0,0.28 0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5c0,0.28 0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5c0,-1.38 1.12,-2.5 2.5,-2.5c1.02,0 1.91,0.6 2.29,1.5H22v2h-2.27c-0.62,0 -1.14,-0.45 -1.23,-1.08c-0.04,-0.24 -0.25,-0.42 -0.49,-0.42c-0.28,0 -0.5,0.22 -0.5,0.5C17.5,13.38 16.38,14.5 15,14.5z"/> android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM16,16L2.81,2.81 1.39,4.22l4.85,4.85C6.09,9.68 6,10.33 6,11v6L4,17v2h12.17l3.61,3.61 1.41,-1.41L16,16zM8,17l0.01,-6.16L14.17,17L8,17zM12,6.5c2.49,0 4,2.02 4,4.5v2.17l2,2L18,11c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68c-0.78,0.18 -1.45,0.52 -2.04,0.95L9.93,7.1c0.58,-0.37 1.27,-0.6 2.07,-0.6z"
</vector> android:fillColor="@android:color/white"/>
</item> </vector>
</layer-list>

View File

@@ -0,0 +1,25 @@
<!--
Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,18h0.17l-1.09,-1.09 1.41,-1.41L16,19l-3.5,3.5 -1.41,-1.41L12.17,20L12,20c-2.05,0 -4.09,-0.78 -5.66,-2.34 -3.12,-3.12 -3.12,-8.19 0,-11.31l1.41,1.41c-2.34,2.34 -2.34,6.15 0,8.49C8.89,17.38 10.4,18 12,18zM17.66,6.34c3.12,3.12 3.12,8.19 0,11.31l-1.41,-1.41c2.34,-2.34 2.34,-6.15 0,-8.49C15.11,6.62 13.6,6 12,6h-0.17l1.09,1.09L11.5,8.5 8,5l3.5,-3.5 1.41,1.41L11.83,4L12,4c2.05,0 4.09,0.78 5.66,2.34z"/>
</vector>

View File

@@ -34,19 +34,23 @@
<CheckBoxPreference <CheckBoxPreference
android:key="type_filter_ongoing" android:key="type_filter_ongoing"
android:title="@string/notif_type_ongoing" android:title="@string/notif_type_ongoing"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.OngoingTypeFilterPreferenceController"/>/> android:icon="@drawable/ic_ongoing_notification"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.OngoingTypeFilterPreferenceController"/>
<CheckBoxPreference <CheckBoxPreference
android:key="type_filter_conversation" android:key="type_filter_conversation"
android:title="@string/notif_type_conversation" android:title="@string/notif_type_conversation"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ConversationTypeFilterPreferenceController"/>/> android:icon="@drawable/ic_promote_conversation"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ConversationTypeFilterPreferenceController"/>
<CheckBoxPreference <CheckBoxPreference
android:key="type_filter_alerting" android:key="type_filter_alerting"
android:title="@string/notif_type_alerting" android:title="@string/notif_type_alerting"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.AlertingTypeFilterPreferenceController"/>/> android:icon="@drawable/ic_notification_alert"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.AlertingTypeFilterPreferenceController"/>
<CheckBoxPreference <CheckBoxPreference
android:key="type_filter_silent" android:key="type_filter_silent"
android:title="@string/notif_type_silent" android:title="@string/notif_type_silent"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.SilentTypeFilterPreferenceController"/>/> android:icon="@drawable/ic_notification_silence"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.SilentTypeFilterPreferenceController"/>
<Preference <Preference
android:key="bridged_apps" android:key="bridged_apps"

View File

@@ -21,4 +21,13 @@
android:key="notification_access_screen" android:key="notification_access_screen"
android:title="@string/manage_notification_access_title" android:title="@string/manage_notification_access_title"
settings:searchable="false" settings:searchable="false"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessScreenPreferenceController" /> settings:controller="com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessScreenPreferenceController">
<PreferenceCategory
android:key="allowed"
android:title="@string/app_permission_summary_allowed"/>
<PreferenceCategory
android:key="not_allowed"
android:title="@string/app_permission_summary_not_allowed"/>
</PreferenceScreen>

View File

@@ -16,6 +16,8 @@
package com.android.settings.applications.specialaccess.notificationaccess; package com.android.settings.applications.specialaccess.notificationaccess;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -30,8 +32,10 @@ import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.NotificationBackend;
import com.android.settings.widget.EntityHeaderController; import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
@@ -43,6 +47,10 @@ public class HeaderPreferenceController extends BasePreferenceController
private PackageInfo mPackageInfo; private PackageInfo mPackageInfo;
private PackageManager mPm; private PackageManager mPm;
private CharSequence mServiceName; private CharSequence mServiceName;
private ICompanionDeviceManager mCdm;
private LocalBluetoothManager mBm;
private ComponentName mCn;
private int mUserId;
public HeaderPreferenceController(Context context, String key) { public HeaderPreferenceController(Context context, String key) {
super(context, key); super(context, key);
@@ -68,6 +76,26 @@ public class HeaderPreferenceController extends BasePreferenceController
return this; return this;
} }
public HeaderPreferenceController setCdm(ICompanionDeviceManager cdm) {
mCdm = cdm;
return this;
}
public HeaderPreferenceController setBluetoothManager(LocalBluetoothManager bm) {
mBm = bm;
return this;
}
public HeaderPreferenceController setCn(ComponentName cn) {
mCn = cn;
return this;
}
public HeaderPreferenceController setUserId(int userId) {
mUserId = userId;
return this;
}
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
return AVAILABLE; return AVAILABLE;
@@ -88,6 +116,8 @@ public class HeaderPreferenceController extends BasePreferenceController
.getBadgedIcon(mPackageInfo.applicationInfo)) .getBadgedIcon(mPackageInfo.applicationInfo))
.setLabel(mPackageInfo.applicationInfo.loadLabel(mPm)) .setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
.setSummary(mServiceName) .setSummary(mServiceName)
.setSecondSummary(new NotificationBackend().getDeviceList(
mCdm, mBm, mCn.getPackageName(), mUserId))
.setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo)) .setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
.setPackageName(mPackageInfo.packageName) .setPackageName(mPackageInfo.packageName)
.setUid(mPackageInfo.applicationInfo.uid) .setUid(mPackageInfo.applicationInfo.uid)

View File

@@ -21,7 +21,7 @@ import static com.android.settings.applications.AppInfoBase.ARG_PACKAGE_NAME;
import android.app.Activity; import android.app.Activity;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothAdapter; import android.companion.ICompanionDeviceManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.os.Bundle; import android.os.Bundle;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
@@ -45,14 +46,13 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.manageapplications.ManageApplications; import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.Utils;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.NotificationBackend; import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -99,7 +99,12 @@ public class NotificationAccessDetails extends DashboardFragment {
.setFragment(this) .setFragment(this)
.setPackageInfo(mPackageInfo) .setPackageInfo(mPackageInfo)
.setPm(context.getPackageManager()) .setPm(context.getPackageManager())
.setServiceName(mServiceName); .setServiceName(mServiceName)
.setBluetoothManager(Utils.getLocalBtManager(context))
.setCdm(ICompanionDeviceManager.Stub.asInterface(
ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)))
.setCn(mComponentName)
.setUserId(mUserId);
getPreferenceControllers().forEach(controllers -> { getPreferenceControllers().forEach(controllers -> {
controllers.forEach(controller -> { controllers.forEach(controller -> {
if (controller instanceof TypeFilterPreferenceController) { if (controller instanceof TypeFilterPreferenceController) {

View File

@@ -20,12 +20,14 @@ import android.annotation.Nullable;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageItemInfo; import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.os.Bundle; import android.os.Bundle;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
@@ -35,6 +37,7 @@ import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
@@ -57,6 +60,9 @@ import java.util.List;
@SearchIndexable @SearchIndexable
public class NotificationAccessSettings extends EmptyTextSettings { public class NotificationAccessSettings extends EmptyTextSettings {
private static final String TAG = "NotifAccessSettings"; private static final String TAG = "NotifAccessSettings";
private static final String ALLOWED_KEY = "allowed";
private static final String NOT_ALLOWED_KEY = "not_allowed";
private static final ManagedServiceSettings.Config CONFIG = private static final ManagedServiceSettings.Config CONFIG =
new ManagedServiceSettings.Config.Builder() new ManagedServiceSettings.Config.Builder()
.setTag(TAG) .setTag(TAG)
@@ -76,6 +82,7 @@ public class NotificationAccessSettings extends EmptyTextSettings {
private DevicePolicyManager mDpm; private DevicePolicyManager mDpm;
private ServiceListing mServiceListing; private ServiceListing mServiceListing;
private IconDrawableFactory mIconDrawableFactory; private IconDrawableFactory mIconDrawableFactory;
private NotificationBackend mBackend = new NotificationBackend();
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
@@ -93,7 +100,6 @@ public class NotificationAccessSettings extends EmptyTextSettings {
.setTag(CONFIG.tag) .setTag(CONFIG.tag)
.build(); .build();
mServiceListing.addCallback(this::updateList); mServiceListing.addCallback(this::updateList);
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
if (UserManager.get(mContext).isManagedProfile()) { if (UserManager.get(mContext).isManagedProfile()) {
// Apps in the work profile do not support notification listeners. // Apps in the work profile do not support notification listeners.
@@ -127,7 +133,11 @@ public class NotificationAccessSettings extends EmptyTextSettings {
final int managedProfileId = Utils.getManagedProfileId(um, UserHandle.myUserId()); final int managedProfileId = Utils.getManagedProfileId(um, UserHandle.myUserId());
final PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();
screen.removeAll(); final PreferenceCategory allowedCategory = screen.findPreference(ALLOWED_KEY);
allowedCategory.removeAll();
final PreferenceCategory notAllowedCategory = screen.findPreference(NOT_ALLOWED_KEY);
notAllowedCategory.removeAll();
services.sort(new PackageItemInfo.DisplayNameComparator(mPm)); services.sort(new PackageItemInfo.DisplayNameComparator(mPm));
for (ServiceInfo service : services) { for (ServiceInfo service : services) {
final ComponentName cn = new ComponentName(service.packageName, service.name); final ComponentName cn = new ComponentName(service.packageName, service.name);
@@ -145,9 +155,11 @@ public class NotificationAccessSettings extends EmptyTextSettings {
pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo, pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo,
UserHandle.getUserId(service.applicationInfo.uid))); UserHandle.getUserId(service.applicationInfo.uid)));
pref.setKey(cn.flattenToString()); pref.setKey(cn.flattenToString());
pref.setSummary(mNm.isNotificationListenerAccessGranted(cn) pref.setSummary(mBackend.getDeviceList(ICompanionDeviceManager.Stub.asInterface(
? R.string.app_permission_summary_allowed ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)),
: R.string.app_permission_summary_not_allowed); com.android.settings.bluetooth.Utils.getLocalBtManager(mContext),
service.packageName,
UserHandle.myUserId()));
if (managedProfileId != UserHandle.USER_NULL if (managedProfileId != UserHandle.USER_NULL
&& !mDpm.isNotificationListenerServicePermitted( && !mDpm.isNotificationListenerServicePermitted(
service.packageName, managedProfileId)) { service.packageName, managedProfileId)) {
@@ -173,7 +185,11 @@ public class NotificationAccessSettings extends EmptyTextSettings {
return true; return true;
}); });
pref.setKey(cn.flattenToString()); pref.setKey(cn.flattenToString());
screen.addPreference(pref); if (mNm.isNotificationListenerAccessGranted(cn)) {
allowedCategory.addPreference(pref);
} else {
notAllowedCategory.addPreference(pref);
}
} }
highlightPreferenceIfNeeded(); highlightPreferenceIfNeeded();
} }

View File

@@ -30,6 +30,7 @@ import android.app.NotificationManager;
import android.app.role.RoleManager; import android.app.role.RoleManager;
import android.app.usage.IUsageStatsManager; import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageEvents; import android.app.usage.UsageEvents;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -55,14 +56,18 @@ import androidx.annotation.VisibleForTesting;
import com.android.settingslib.R; import com.android.settingslib.R;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.notification.ConversationIconFactory; import com.android.settingslib.notification.ConversationIconFactory;
import com.android.settingslib.utils.StringUtil; import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
public class NotificationBackend { public class NotificationBackend {
private static final String TAG = "NotificationBackend"; private static final String TAG = "NotificationBackend";
@@ -138,6 +143,35 @@ public class NotificationBackend {
} }
} }
static public CharSequence getDeviceList(ICompanionDeviceManager cdm, LocalBluetoothManager lbm,
String pkg, int userId) {
boolean multiple = false;
StringBuilder sb = new StringBuilder();
try {
List<String> associatedMacAddrs = cdm.getAssociations(pkg, userId);
if (associatedMacAddrs != null) {
for (String assocMac : associatedMacAddrs) {
final Collection<CachedBluetoothDevice> cachedDevices =
lbm.getCachedDeviceManager().getCachedDevicesCopy();
for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) {
if (Objects.equals(assocMac, cachedBluetoothDevice.getAddress())) {
if (multiple) {
sb.append(", ");
} else {
multiple = true;
}
sb.append(cachedBluetoothDevice.getName());
}
}
}
}
} catch (RemoteException e) {
Log.w(TAG, "Error calling CDM", e);
}
return sb.toString();
}
public boolean isSystemApp(Context context, ApplicationInfo app) { public boolean isSystemApp(Context context, ApplicationInfo app) {
try { try {
PackageInfo info = context.getPackageManager().getPackageInfo( PackageInfo info = context.getPackageManager().getPackageInfo(

View File

@@ -26,24 +26,50 @@ import static org.mockito.Mockito.when;
import android.app.role.RoleManager; import android.app.role.RoleManager;
import android.app.usage.UsageEvents; import android.app.usage.UsageEvents;
import android.bluetooth.BluetoothAdapter;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Parcel; import android.os.Parcel;
import com.android.settings.notification.NotificationBackend.AppRow; import com.android.settings.notification.NotificationBackend.AppRow;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class NotificationBackendTest { public class NotificationBackendTest {
@Mock
LocalBluetoothManager mBm;
@Mock
ICompanionDeviceManager mCdm;
@Mock
CachedBluetoothDeviceManager mCbm;
ComponentName mCn = new ComponentName("a", "b");
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mBm.getCachedDeviceManager()).thenReturn(mCbm);
}
@Test @Test
public void testMarkAppRow_unblockablePackage() { public void testMarkAppRow_unblockablePackage() {
AppRow appRow = new AppRow(); AppRow appRow = new AppRow();
@@ -138,4 +164,69 @@ public class NotificationBackendTest {
parcel.setDataPosition(0); parcel.setDataPosition(0);
return UsageEvents.CREATOR.createFromParcel(parcel); return UsageEvents.CREATOR.createFromParcel(parcel);
} }
@Test
public void getDeviceList_noAssociations() throws Exception {
when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(null);
Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
CachedBluetoothDevice cbd1 = mock(CachedBluetoothDevice.class);
when(cbd1.getAddress()).thenReturn("00:00:00:00:00:10");
when(cbd1.getName()).thenReturn("Device 1");
cachedDevices.add(cbd1);
when(mCbm.getCachedDevicesCopy()).thenReturn(cachedDevices);
BluetoothAdapter.getDefaultAdapter().enable();
assertThat(new NotificationBackend().getDeviceList(
mCdm, mBm, mCn.getPackageName(), 0).toString()).isEmpty();
}
@Test
public void getDeviceList_associationsButNoDevice() throws Exception {
List<String> macs = ImmutableList.of("00:00:00:00:00:10", "00:00:00:00:00:20");
when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(macs);
when(mCbm.getCachedDevicesCopy()).thenReturn(new ArrayList<>());
assertThat(new NotificationBackend().getDeviceList(
mCdm, mBm, mCn.getPackageName(), 0).toString()).isEmpty();
}
@Test
public void getDeviceList_singleDevice() throws Exception {
List<String> macs = ImmutableList.of("00:00:00:00:00:10", "00:00:00:00:00:20");
when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(macs);
Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
CachedBluetoothDevice cbd1 = mock(CachedBluetoothDevice.class);
when(cbd1.getAddress()).thenReturn(macs.get(0));
when(cbd1.getName()).thenReturn("Device 1");
cachedDevices.add(cbd1);
when(mCbm.getCachedDevicesCopy()).thenReturn(cachedDevices);
assertThat(new NotificationBackend().getDeviceList(
mCdm, mBm, mCn.getPackageName(), 0).toString()).isEqualTo("Device 1");
}
@Test
public void getDeviceList_multipleDevices() throws Exception {
List<String> macs = ImmutableList.of("00:00:00:00:00:10", "00:00:00:00:00:20");
when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(macs);
Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
CachedBluetoothDevice cbd1 = mock(CachedBluetoothDevice.class);
when(cbd1.getAddress()).thenReturn(macs.get(0));
when(cbd1.getName()).thenReturn("Device 1");
cachedDevices.add(cbd1);
CachedBluetoothDevice cbd2 = mock(CachedBluetoothDevice.class);
when(cbd2.getAddress()).thenReturn(macs.get(1));
when(cbd2.getName()).thenReturn("Device 2");
cachedDevices.add(cbd2);
when(mCbm.getCachedDevicesCopy()).thenReturn(cachedDevices);
assertThat(new NotificationBackend().getDeviceList(
mCdm, mBm, mCn.getPackageName(), 0).toString()).isEqualTo("Device 1, Device 2");
}
} }