blob: b1a02f775924d34418f86e47748c1a6b6f12a513 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
* Copyright (C) 2023 The LineageOS 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.
*/
package com.android.dialer.util;
import android.net.Uri;
import android.provider.ContactsContract;
import java.util.List;
/** Utility methods for dealing with URIs. */
public class UriUtils {
private static final String LOOKUP_URI_ENCODED = "encoded";
/** Static helper, not instantiable. */
private UriUtils() {}
/** Checks whether two URI are equal, taking care of the case where either is null. */
public static boolean areEqual(Uri uri1, Uri uri2) {
if (uri1 == null && uri2 == null) {
return true;
}
if (uri1 == null || uri2 == null) {
return false;
}
return uri1.equals(uri2);
}
/** Parses a string into a URI and returns null if the given string is null. */
public static Uri parseUriOrNull(String uriString) {
if (uriString == null) {
return null;
}
return Uri.parse(uriString);
}
/** Converts a URI into a string, returns null if the given URI is null. */
public static String uriToString(Uri uri) {
return uri == null ? null : uri.toString();
}
public static boolean isEncodedContactUri(Uri uri) {
if (uri == null) {
return false;
}
final String lastPathSegment = uri.getLastPathSegment();
if (lastPathSegment == null) {
return false;
}
return lastPathSegment.equals(LOOKUP_URI_ENCODED);
}
/**
* @return {@code uri} as-is if the authority is of contacts provider. Otherwise or {@code uri} is
* null, return null otherwise
*/
public static Uri nullForNonContactsUri(Uri uri) {
if (uri == null) {
return null;
}
return ContactsContract.AUTHORITY.equals(uri.getAuthority()) ? uri : null;
}
/** Parses the given URI to determine the original lookup key of the contact. */
public static String getLookupKeyFromUri(Uri lookupUri) {
// Would be nice to be able to persist the lookup key somehow to avoid having to parse
// the uri entirely just to retrieve the lookup key, but every uri is already parsed
// once anyway to check if it is an encoded JSON uri, so this has negligible effect
// on performance.
if (lookupUri != null && !UriUtils.isEncodedContactUri(lookupUri)) {
final List<String> segments = lookupUri.getPathSegments();
// This returns the third path segment of the uri, where the lookup key is located.
// See {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
return (segments.size() < 3) ? null : Uri.encode(segments.get(2));
} else {
return null;
}
}
}