Merge "Add CompatUtils#isNCompatible()" into ub-contactsdialer-b-dev
diff --git a/src/com/android/contacts/common/compat/CompatUtils.java b/src/com/android/contacts/common/compat/CompatUtils.java
index c84bcfa..58f0362 100644
--- a/src/com/android/contacts/common/compat/CompatUtils.java
+++ b/src/com/android/contacts/common/compat/CompatUtils.java
@@ -16,6 +16,7 @@
package com.android.contacts.common.compat;
import android.os.Build;
+import android.os.Build.VERSION;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
@@ -40,6 +41,8 @@
public final static int TYPE_ASSERT = 4;
+ private final static Boolean CODENAME_STARTS_WITH_N = VERSION.CODENAME.startsWith("N");
+
/**
* Returns whether the operation in CPOWrapper is of TYPE_INSERT;
*/
@@ -60,8 +63,8 @@
}
/**
- * Determines if this version is compatible with multi-SIM and the phone account APIs.
- * Can also force the version to be lower through SdkVersionOverride.
+ * Determines if this version is compatible with multi-SIM and the phone account APIs. Can also
+ * force the version to be lower through SdkVersionOverride.
*
* @return {@code true} if multi-SIM capability is available, {@code false} otherwise.
*/
@@ -82,8 +85,8 @@
}
/**
- * Determines if this version is capable of using presence checking for video calling.
- * Support for video call presence indication is added in SDK 24.
+ * Determines if this version is capable of using presence checking for video calling. Support
+ * for video call presence indication is added in SDK 24.
*
* @return {@code true} if video presence checking is allowed, {@code false} otherwise.
*/
@@ -93,8 +96,8 @@
}
/**
- * Determines if this version is compatible with call subject. Can also force the version to
- * be lower through SdkVersionOverride.
+ * Determines if this version is compatible with call subject. Can also force the version to be
+ * lower through SdkVersionOverride.
*
* @return {@code true} if call subject is a feature on this device, {@code false} otherwise.
*/
@@ -117,7 +120,7 @@
* Determines if this version is compatible with Lollipop Mr1-specific APIs. Can also force the
* version to be lower through SdkVersionOverride.
*
- * @return {@code true} if call subject is a feature on this device, {@code false} otherwise.
+ * @return {@code true} if runtime sdk is compatible with Lollipop MR1, {@code false} otherwise.
*/
public static boolean isLollipopMr1Compatible() {
return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP_MR1)
@@ -128,7 +131,7 @@
* Determines if this version is compatible with Marshmallow-specific APIs. Can also force the
* version to be lower through SdkVersionOverride.
*
- * @return {@code true} if call subject is a feature on this device, {@code false} otherwise.
+ * @return {@code true} if runtime sdk is compatible with Marshmallow, {@code false} otherwise.
*/
public static boolean isMarshmallowCompatible() {
return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP)
@@ -136,12 +139,27 @@
}
/**
+ * Determines if this version is compatible with N-specific APIs.
+ *
+ * @return {@code true} if runtime sdk is compatible with N and the app is built with N, {@code
+ * false} otherwise.
+ */
+ public static boolean isNCompatible() {
+ // SdkVersionOverride doesn't work here because VERSION.SDK_INT remains 23 (same as M)
+ // before N is release
+
+ // TODO: remove build time check and use proper runtime check once N is released.
+ return SdkSelectionUtils.TARGET_N_SDK // Build time flag
+ && CODENAME_STARTS_WITH_N; // Run time flag
+ }
+
+ /**
* Determines if the given class is available. Can be used to check if system apis exist at
* runtime.
*
* @param className the name of the class to look for.
* @return {@code true} if the given class is available, {@code false} otherwise or if className
- * is empty.
+ * is empty.
*/
public static boolean isClassAvailable(@Nullable String className) {
if (TextUtils.isEmpty(className)) {
@@ -167,7 +185,7 @@
* @param methodName the name of the method to look for
* @param parameterTypes the needed parameter types for the method to look for
* @return {@code true} if the given class is available, {@code false} otherwise or if className
- * or methodName are empty.
+ * or methodName are empty.
*/
public static boolean isMethodAvailable(@Nullable String className, @Nullable String methodName,
Class<?>... parameterTypes) {
@@ -196,8 +214,8 @@
* @param methodName The name of the method to invoke.
* @param parameterTypes The needed parameter types for the method.
* @param parameters The parameter values to pass into the method.
- * @return The result of the invocation or {@code null} if instance or methodName are
- * empty, or if the reflection fails.
+ * @return The result of the invocation or {@code null} if instance or methodName are empty, or
+ * if the reflection fails.
*/
@Nullable
public static Object invokeMethod(@Nullable Object instance, @Nullable String methodName,