[DO NOT MERGE] Provide CDM util to check if ok to pair BT without prompt

Test: presubmit
Bug: 172006481
Merged-In: Ibc544466ccd8f1f24fc9899a740024e8c324e721
Change-Id: Ibc544466ccd8f1f24fc9899a740024e8c324e721
  (cherry picked from commit ff7c1ea572)
This commit is contained in:
Eugene Susla
2021-01-27 16:18:29 -08:00
parent 084f3be4b1
commit f89fcec4b7
4 changed files with 68 additions and 10 deletions

View File

@@ -23,6 +23,7 @@ import android.os.Parcelable;
import com.android.internal.util.DataClass;
import java.util.Date;
import java.util.Objects;
/**
@@ -39,12 +40,19 @@ public final class Association implements Parcelable {
private final @NonNull String mPackageName;
private final @Nullable String mDeviceProfile;
private final boolean mNotifyOnDeviceNearby;
private final long mTimeApprovedMs;
/** @hide */
public int getUserId() {
return mUserId;
}
private String timeApprovedMsToString() {
return new Date(mTimeApprovedMs).toString();
}
// Code below generated by codegen v1.0.22.
@@ -71,7 +79,8 @@ public final class Association implements Parcelable {
@NonNull String deviceMacAddress,
@NonNull String packageName,
@Nullable String deviceProfile,
boolean notifyOnDeviceNearby) {
boolean notifyOnDeviceNearby,
long timeApprovedMs) {
this.mUserId = userId;
com.android.internal.util.AnnotationValidations.validate(
UserIdInt.class, null, mUserId);
@@ -83,6 +92,7 @@ public final class Association implements Parcelable {
NonNull.class, null, mPackageName);
this.mDeviceProfile = deviceProfile;
this.mNotifyOnDeviceNearby = notifyOnDeviceNearby;
this.mTimeApprovedMs = timeApprovedMs;
// onConstructed(); // You can define this method to get a callback
}
@@ -107,6 +117,11 @@ public final class Association implements Parcelable {
return mNotifyOnDeviceNearby;
}
@DataClass.Generated.Member
public long getTimeApprovedMs() {
return mTimeApprovedMs;
}
@Override
@DataClass.Generated.Member
public String toString() {
@@ -118,7 +133,8 @@ public final class Association implements Parcelable {
"deviceMacAddress = " + mDeviceMacAddress + ", " +
"packageName = " + mPackageName + ", " +
"deviceProfile = " + mDeviceProfile + ", " +
"notifyOnDeviceNearby = " + mNotifyOnDeviceNearby +
"notifyOnDeviceNearby = " + mNotifyOnDeviceNearby + ", " +
"timeApprovedMs = " + timeApprovedMsToString() +
" }";
}
@@ -139,7 +155,8 @@ public final class Association implements Parcelable {
&& Objects.equals(mDeviceMacAddress, that.mDeviceMacAddress)
&& Objects.equals(mPackageName, that.mPackageName)
&& Objects.equals(mDeviceProfile, that.mDeviceProfile)
&& mNotifyOnDeviceNearby == that.mNotifyOnDeviceNearby;
&& mNotifyOnDeviceNearby == that.mNotifyOnDeviceNearby
&& mTimeApprovedMs == that.mTimeApprovedMs;
}
@Override
@@ -154,6 +171,7 @@ public final class Association implements Parcelable {
_hash = 31 * _hash + Objects.hashCode(mPackageName);
_hash = 31 * _hash + Objects.hashCode(mDeviceProfile);
_hash = 31 * _hash + Boolean.hashCode(mNotifyOnDeviceNearby);
_hash = 31 * _hash + Long.hashCode(mTimeApprovedMs);
return _hash;
}
@@ -171,6 +189,7 @@ public final class Association implements Parcelable {
dest.writeString(mDeviceMacAddress);
dest.writeString(mPackageName);
if (mDeviceProfile != null) dest.writeString(mDeviceProfile);
dest.writeLong(mTimeApprovedMs);
}
@Override
@@ -190,6 +209,7 @@ public final class Association implements Parcelable {
String deviceMacAddress = in.readString();
String packageName = in.readString();
String deviceProfile = (flg & 0x8) == 0 ? null : in.readString();
long timeApprovedMs = in.readLong();
this.mUserId = userId;
com.android.internal.util.AnnotationValidations.validate(
@@ -202,6 +222,7 @@ public final class Association implements Parcelable {
NonNull.class, null, mPackageName);
this.mDeviceProfile = deviceProfile;
this.mNotifyOnDeviceNearby = notifyOnDeviceNearby;
this.mTimeApprovedMs = timeApprovedMs;
// onConstructed(); // You can define this method to get a callback
}
@@ -221,10 +242,10 @@ public final class Association implements Parcelable {
};
@DataClass.Generated(
time = 1610482674799L,
time = 1612832377589L,
codegenVersion = "1.0.22",
sourceFile = "frameworks/base/core/java/android/companion/Association.java",
inputSignatures = "private final @android.annotation.UserIdInt int mUserId\nprivate final @android.annotation.NonNull java.lang.String mDeviceMacAddress\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mDeviceProfile\nprivate final boolean mNotifyOnDeviceNearby\npublic int getUserId()\nclass Association extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genHiddenConstructor=true)")
inputSignatures = "private final @android.annotation.UserIdInt int mUserId\nprivate final @android.annotation.NonNull java.lang.String mDeviceMacAddress\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mDeviceProfile\nprivate final boolean mNotifyOnDeviceNearby\nprivate final long mTimeApprovedMs\npublic int getUserId()\nprivate java.lang.String timeApprovedMsToString()\nclass Association extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genHiddenConstructor=true)")
@Deprecated
private void __metadata() {}

View File

@@ -49,4 +49,6 @@ interface ICompanionDeviceManager {
void registerDevicePresenceListenerService(in String packageName, in String deviceAddress);
void unregisterDevicePresenceListenerService(in String packageName, in String deviceAddress);
boolean canPairWithoutPrompt(in String packageName, in String deviceMacAddress, int userId);
}

View File

@@ -322,7 +322,8 @@ public class DeviceDiscoveryService extends Service {
void onDeviceSelected(String callingPackage, String deviceAddress) {
mServiceCallback.complete(new Association(
getUserId(), deviceAddress, callingPackage, mRequest.getDeviceProfile(), false));
getUserId(), deviceAddress, callingPackage, mRequest.getDeviceProfile(), false,
System.currentTimeMillis()));
}
void onCancel() {

View File

@@ -154,6 +154,8 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
private static final boolean DEBUG = false;
private static final String LOG_TAG = "CompanionDeviceManagerService";
private static final long PAIR_WITHOUT_PROMPT_WINDOW_MS = 10 * 60 * 1000; // 10 min
private static final String PREF_FILE_NAME = "companion_device_preferences.xml";
private static final String PREF_KEY_AUTO_REVOKE_GRANTS_DONE = "auto_revoke_grants_done";
@@ -163,6 +165,7 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
private static final String XML_ATTR_DEVICE = "device";
private static final String XML_ATTR_PROFILE = "profile";
private static final String XML_ATTR_NOTIFY_DEVICE_NEARBY = "notify_device_nearby";
private static final String XML_ATTR_TIME_APPROVED = "time_approved";
private static final String XML_FILE_NAME = "companion_device_manager_associations.xml";
private final CompanionDeviceManagerImpl mImpl;
@@ -595,7 +598,8 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
association.getDeviceMacAddress(),
association.getPackageName(),
association.getDeviceProfile(),
active /* notifyOnDeviceNearby */);
active, /* notifyOnDeviceNearby */
association.getTimeApprovedMs());
} else {
return association;
}
@@ -627,6 +631,15 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
+ " in manifest to use this API");
}
@Override
public boolean canPairWithoutPrompt(
String packageName, String deviceMacAddress, int userId) {
return CollectionUtils.any(
getAllAssociations(userId, packageName, deviceMacAddress),
a -> System.currentTimeMillis() - a.getTimeApprovedMs()
< PAIR_WITHOUT_PROMPT_WINDOW_MS);
}
@Override
public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
String[] args, ShellCallback callback, ResultReceiver resultReceiver)
@@ -866,6 +879,8 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
Boolean.toString(
association.isNotifyOnDeviceNearby()));
}
tag.attribute(null, XML_ATTR_TIME_APPROVED,
Long.toString(association.getTimeApprovedMs()));
tag.endTag(null, XML_TAG_ASSOCIATION);
});
@@ -905,7 +920,6 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
return getContext().getSystemService(UserManager.class).getUsers();
}
@Nullable
private Set<Association> getAllAssociations(int userId, @Nullable String packageFilter) {
return CollectionUtils.filter(
getAllAssociations(userId),
@@ -920,6 +934,14 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
return result;
}
private Set<Association> getAllAssociations(
int userId, @Nullable String packageFilter, @Nullable String addressFilter) {
return CollectionUtils.filter(
getAllAssociations(userId),
a -> Objects.equals(packageFilter, a.getPackageName())
&& Objects.equals(addressFilter, a.getDeviceMacAddress()));
}
private Set<Association> readAllAssociations(int userId) {
final AtomicFile file = getStorageFileForUser(userId);
@@ -941,12 +963,14 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
final String profile = parser.getAttributeValue(null, XML_ATTR_PROFILE);
final boolean persistentGrants = Boolean.valueOf(
parser.getAttributeValue(null, XML_ATTR_NOTIFY_DEVICE_NEARBY));
final long timeApproved = parseLongOrDefault(
parser.getAttributeValue(null, XML_ATTR_TIME_APPROVED), 0L);
if (appPackage == null || deviceAddress == null) continue;
result = ArrayUtils.add(result,
new Association(userId, deviceAddress, appPackage,
profile, persistentGrants));
profile, persistentGrants, timeApproved));
}
return result;
} catch (XmlPullParserException | IOException e) {
@@ -1215,6 +1239,15 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
return result;
}
private static long parseLongOrDefault(String str, long def) {
try {
return Long.parseLong(str);
} catch (NumberFormatException e) {
Log.w(LOG_TAG, "Failed to parse", e);
return def;
}
}
private class ShellCmd extends ShellCommand {
public static final String USAGE = "help\n"
+ "list USER_ID\n"
@@ -1243,7 +1276,8 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
int userId = getNextArgInt();
String pkg = getNextArgRequired();
String address = getNextArgRequired();
addAssociation(new Association(userId, address, pkg, null, false));
addAssociation(new Association(userId, address, pkg, null, false,
System.currentTimeMillis()));
}
break;