Copy Uri#isPathPrefixMatch to Telephony to avoid using hidden
API in Uri.
Test: TeleServiceTests
Bug: 147828972
Change-Id: Id736da23cb4aeeaa0711cac53b768f895301bb35
diff --git a/src/com/android/phone/ServiceStateProvider.java b/src/com/android/phone/ServiceStateProvider.java
index 9e6ea83..00269e0 100644
--- a/src/com/android/phone/ServiceStateProvider.java
+++ b/src/com/android/phone/ServiceStateProvider.java
@@ -61,6 +61,8 @@
import com.android.internal.annotations.VisibleForTesting;
import java.util.HashMap;
+import java.util.List;
+import java.util.Objects;
/**
* The class to provide base facility to access ServiceState related content,
@@ -128,7 +130,7 @@
@Override
public Uri insert(Uri uri, ContentValues values) {
- if (uri.isPathPrefixMatch(CONTENT_URI)) {
+ if (isPathPrefixMatch(uri, CONTENT_URI)) {
// Parse the subId
int subId = 0;
try {
@@ -183,7 +185,7 @@
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
- if (!uri.isPathPrefixMatch(CONTENT_URI)) {
+ if (!isPathPrefixMatch(uri, CONTENT_URI)) {
throw new IllegalArgumentException("Invalid URI: " + uri);
} else {
// Parse the subId
@@ -362,4 +364,29 @@
context.getContentResolver().notifyChange(getUriForSubscriptionId(subId), null, false);
}
}
+
+ /**
+ * Test if this is a path prefix match against the given Uri. Verifies that
+ * scheme, authority, and atomic path segments match.
+ *
+ * Copied from frameworks/base/core/java/android/net/Uri.java
+ */
+ private boolean isPathPrefixMatch(Uri uriA, Uri uriB) {
+ if (!Objects.equals(uriA.getScheme(), uriB.getScheme())) return false;
+ if (!Objects.equals(uriA.getAuthority(), uriB.getAuthority())) return false;
+
+ List<String> segA = uriA.getPathSegments();
+ List<String> segB = uriB.getPathSegments();
+
+ final int size = segB.size();
+ if (segA.size() < size) return false;
+
+ for (int i = 0; i < size; i++) {
+ if (!Objects.equals(segA.get(i), segB.get(i))) {
+ return false;
+ }
+ }
+
+ return true;
+ }
}