Add device list to NLS pages

If a notification listener has access via the
companion device manager api, list the name(s) of the
associated devices to give the user more context about
why the app has notification listener access.

Test: settings unit
Bug: 181125174
Change-Id: I01771b2c4e136fe16d23e89f33f85f63803e3f7c
This commit is contained in:
Julia Reynolds
2021-03-03 17:36:35 -05:00
parent 84d83e2923
commit ef6646458b
4 changed files with 212 additions and 8 deletions

View File

@@ -16,10 +16,14 @@
package com.android.settings.applications.specialaccess.notificationaccess;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.util.IconDrawableFactory;
import android.util.Log;
import android.view.View;
import androidx.lifecycle.LifecycleObserver;
@@ -32,9 +36,15 @@ import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.LayoutPreference;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
public class HeaderPreferenceController extends BasePreferenceController
implements PreferenceControllerMixin, LifecycleObserver {
@@ -43,6 +53,10 @@ public class HeaderPreferenceController extends BasePreferenceController
private PackageInfo mPackageInfo;
private PackageManager mPm;
private CharSequence mServiceName;
private ICompanionDeviceManager mCdm;
private LocalBluetoothManager mBm;
private ComponentName mCn;
private int mUserId;
public HeaderPreferenceController(Context context, String key) {
super(context, key);
@@ -68,6 +82,26 @@ public class HeaderPreferenceController extends BasePreferenceController
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
public int getAvailabilityStatus() {
return AVAILABLE;
@@ -88,6 +122,7 @@ public class HeaderPreferenceController extends BasePreferenceController
.getBadgedIcon(mPackageInfo.applicationInfo))
.setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
.setSummary(mServiceName)
.setSecondSummary(getDeviceList())
.setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
.setPackageName(mPackageInfo.packageName)
.setUid(mPackageInfo.applicationInfo.uid)
@@ -104,4 +139,33 @@ public class HeaderPreferenceController extends BasePreferenceController
mHeaderController.styleActionBar(mFragment.getActivity());
}
}
protected CharSequence getDeviceList() {
boolean multiple = false;
StringBuilder sb = new StringBuilder();
try {
List<String> associatedMacAddrs =
mCdm.getAssociations(mCn.getPackageName(), mUserId);
if (associatedMacAddrs != null) {
for (String assocMac : associatedMacAddrs) {
final Collection<CachedBluetoothDevice> cachedDevices =
mBm.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();
}
}

View File

@@ -21,7 +21,7 @@ import static com.android.settings.applications.AppInfoBase.ARG_PACKAGE_NAME;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothAdapter;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -45,14 +46,13 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
@@ -99,7 +99,12 @@ public class NotificationAccessDetails extends DashboardFragment {
.setFragment(this)
.setPackageInfo(mPackageInfo)
.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 -> {
controllers.forEach(controller -> {
if (controller instanceof TypeFilterPreferenceController) {