summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/util/FunctionalUtils.java27
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java146
2 files changed, 109 insertions, 64 deletions
diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java
index 9168438dc2bf..05ecdf905623 100644
--- a/core/java/com/android/internal/util/FunctionalUtils.java
+++ b/core/java/com/android/internal/util/FunctionalUtils.java
@@ -21,6 +21,7 @@ import android.os.RemoteException;
import android.util.ExceptionUtils;
import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -196,6 +197,32 @@ public class FunctionalUtils {
}
/**
+ * A {@link BiFunction} that allows throwing checked exceptions from its single abstract method.
+ *
+ * Can be used together with {@link #uncheckExceptions} to effectively turn a lambda expression
+ * that throws a checked exception into a regular {@link BiFunction}
+ *
+ * @param <T> see {@link BiFunction}
+ * @param <U> see {@link BiFunction}
+ * @param <R> see {@link BiFunction}
+ */
+ @FunctionalInterface
+ @SuppressWarnings("FunctionalInterfaceMethodChanged")
+ public interface ThrowingBiFunction<T, U, R> extends BiFunction<T, U, R> {
+ /** @see ThrowingFunction */
+ R applyOrThrow(T t, U u) throws Exception;
+
+ @Override
+ default R apply(T t, U u) {
+ try {
+ return applyOrThrow(t, u);
+ } catch (Exception ex) {
+ throw ExceptionUtils.propagate(ex);
+ }
+ }
+ }
+
+ /**
* A {@link BiConsumer} that allows throwing checked exceptions from its single abstract method.
*
* Can be used together with {@link #uncheckExceptions} to effectively turn a lambda expression
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index ce5412f0fbcc..e9ee06c246ba 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -148,20 +148,24 @@ public class SubscriptionManager {
public static final String CACHE_KEY_ACTIVE_DATA_SUB_ID_PROPERTY =
"cache_key.telephony.get_active_data_sub_id";
+ /** @hide */
+ public static final String CACHE_KEY_SLOT_INDEX_PROPERTY =
+ "cache_key.telephony.get_slot_index";
+
private static final int MAX_CACHE_SIZE = 4;
- private static class SubscriptionPropertyInvalidatedCache<T>
+ private static class VoidPropertyInvalidatedCache<T>
extends PropertyInvalidatedCache<Void, T> {
- private final FunctionalUtils.ThrowingFunction<ISub, T> mSubscriptionInterfaceMethod;
+ private final FunctionalUtils.ThrowingFunction<ISub, T> mInterfaceMethod;
private final String mCacheKeyProperty;
private final T mDefaultValue;
- SubscriptionPropertyInvalidatedCache(
+ VoidPropertyInvalidatedCache(
FunctionalUtils.ThrowingFunction<ISub, T> subscriptionInterfaceMethod,
String cacheKeyProperty,
T defaultValue) {
super(MAX_CACHE_SIZE, cacheKeyProperty);
- mSubscriptionInterfaceMethod = subscriptionInterfaceMethod;
+ mInterfaceMethod = subscriptionInterfaceMethod;
mCacheKeyProperty = cacheKeyProperty;
mDefaultValue = defaultValue;
}
@@ -173,7 +177,41 @@ public class SubscriptionManager {
try {
ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
- result = mSubscriptionInterfaceMethod.applyOrThrow(iSub);
+ result = mInterfaceMethod.applyOrThrow(iSub);
+ }
+ } catch (Exception ex) {
+ Rlog.w(LOG_TAG, "Failed to recompute cache key for " + mCacheKeyProperty);
+ }
+
+ if (VDBG) logd("recomputing " + mCacheKeyProperty + ", result = " + result);
+ return result;
+ }
+ }
+
+ private static class IntegerPropertyInvalidatedCache<T>
+ extends PropertyInvalidatedCache<Integer, T> {
+ private final FunctionalUtils.ThrowingBiFunction<ISub, Integer, T> mInterfaceMethod;
+ private final String mCacheKeyProperty;
+ private final T mDefaultValue;
+
+ IntegerPropertyInvalidatedCache(
+ FunctionalUtils.ThrowingBiFunction<ISub, Integer, T> subscriptionInterfaceMethod,
+ String cacheKeyProperty,
+ T defaultValue) {
+ super(MAX_CACHE_SIZE, cacheKeyProperty);
+ mInterfaceMethod = subscriptionInterfaceMethod;
+ mCacheKeyProperty = cacheKeyProperty;
+ mDefaultValue = defaultValue;
+ }
+
+ @Override
+ protected T recompute(Integer query) {
+ T result = mDefaultValue;
+
+ try {
+ ISub iSub = TelephonyManager.getSubscriptionService();
+ if (iSub != null) {
+ result = mInterfaceMethod.applyOrThrow(iSub, query);
}
} catch (Exception ex) {
Rlog.w(LOG_TAG, "Failed to recompute cache key for " + mCacheKeyProperty);
@@ -184,26 +222,37 @@ public class SubscriptionManager {
}
}
- private static SubscriptionPropertyInvalidatedCache<Integer> sDefaultSubIdCache =
- new SubscriptionPropertyInvalidatedCache<>(ISub::getDefaultSubId,
+ private static VoidPropertyInvalidatedCache<Integer> sDefaultSubIdCache =
+ new VoidPropertyInvalidatedCache<>(ISub::getDefaultSubId,
CACHE_KEY_DEFAULT_SUB_ID_PROPERTY,
INVALID_SUBSCRIPTION_ID);
- private static SubscriptionPropertyInvalidatedCache<Integer> sDefaultDataSubIdCache =
- new SubscriptionPropertyInvalidatedCache<>(ISub::getDefaultDataSubId,
+ private static VoidPropertyInvalidatedCache<Integer> sDefaultDataSubIdCache =
+ new VoidPropertyInvalidatedCache<>(ISub::getDefaultDataSubId,
CACHE_KEY_DEFAULT_DATA_SUB_ID_PROPERTY,
INVALID_SUBSCRIPTION_ID);
- private static PropertyInvalidatedCache<Void, Integer> sDefaultSmsSubIdCache =
- new SubscriptionPropertyInvalidatedCache<>(ISub::getDefaultSmsSubId,
+ private static VoidPropertyInvalidatedCache<Integer> sDefaultSmsSubIdCache =
+ new VoidPropertyInvalidatedCache<>(ISub::getDefaultSmsSubId,
CACHE_KEY_DEFAULT_SMS_SUB_ID_PROPERTY,
INVALID_SUBSCRIPTION_ID);
- private static PropertyInvalidatedCache<Void, Integer> sActiveDataSubIdCache =
- new SubscriptionPropertyInvalidatedCache<>(ISub::getActiveDataSubscriptionId,
+ private static VoidPropertyInvalidatedCache<Integer> sActiveDataSubIdCache =
+ new VoidPropertyInvalidatedCache<>(ISub::getActiveDataSubscriptionId,
CACHE_KEY_ACTIVE_DATA_SUB_ID_PROPERTY,
INVALID_SUBSCRIPTION_ID);
+ private static IntegerPropertyInvalidatedCache<Integer> sSlotIndexCache =
+ new IntegerPropertyInvalidatedCache<>(ISub::getSlotIndex,
+ CACHE_KEY_SLOT_INDEX_PROPERTY,
+ INVALID_SIM_SLOT_INDEX);
+
+ /** Cache depends on getDefaultSubId, so we use the defaultSubId cache key */
+ private static IntegerPropertyInvalidatedCache<Integer> sPhoneIdCache =
+ new IntegerPropertyInvalidatedCache<>(ISub::getPhoneId,
+ CACHE_KEY_DEFAULT_SUB_ID_PROPERTY,
+ INVALID_PHONE_INDEX);
+
/**
* Generates a content {@link Uri} used to receive updates on simInfo change
* on the given subscriptionId
@@ -1246,7 +1295,6 @@ public class SubscriptionManager {
}
return subInfo;
-
}
/**
@@ -1816,25 +1864,7 @@ public class SubscriptionManager {
* subscriptionId doesn't have an associated slot index.
*/
public static int getSlotIndex(int subscriptionId) {
- if (!isValidSubscriptionId(subscriptionId)) {
- if (DBG) {
- logd("[getSlotIndex]- supplied subscriptionId is invalid.");
- }
- }
-
- int result = INVALID_SIM_SLOT_INDEX;
-
- try {
- ISub iSub = TelephonyManager.getSubscriptionService();
- if (iSub != null) {
- result = iSub.getSlotIndex(subscriptionId);
- }
- } catch (RemoteException ex) {
- // ignore it
- }
-
- return result;
-
+ return sSlotIndexCache.query(subscriptionId);
}
/**
@@ -1873,27 +1903,7 @@ public class SubscriptionManager {
/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public static int getPhoneId(int subId) {
- if (!isValidSubscriptionId(subId)) {
- if (DBG) {
- logd("[getPhoneId]- fail");
- }
- return INVALID_PHONE_INDEX;
- }
-
- int result = INVALID_PHONE_INDEX;
-
- try {
- ISub iSub = TelephonyManager.getSubscriptionService();
- if (iSub != null) {
- result = iSub.getPhoneId(subId);
- }
- } catch (RemoteException ex) {
- // ignore it
- }
-
- if (VDBG) logd("[getPhoneId]- phoneId=" + result);
- return result;
-
+ return sPhoneIdCache.query(subId);
}
private static void logd(String msg) {
@@ -3326,16 +3336,9 @@ public class SubscriptionManager {
PropertyInvalidatedCache.invalidateCache(CACHE_KEY_ACTIVE_DATA_SUB_ID_PROPERTY);
}
- /**
- * Clears all process-local binder caches.
- *
- * @hide
- */
- public static void clearCaches() {
- sDefaultSubIdCache.clear();
- sDefaultDataSubIdCache.clear();
- sActiveDataSubIdCache.clear();
- sDefaultSmsSubIdCache.clear();
+ /** @hide */
+ public static void invalidateSlotIndexCaches() {
+ PropertyInvalidatedCache.invalidateCache(CACHE_KEY_SLOT_INDEX_PROPERTY);
}
/**
@@ -3348,5 +3351,20 @@ public class SubscriptionManager {
sDefaultDataSubIdCache.disableLocal();
sActiveDataSubIdCache.disableLocal();
sDefaultSmsSubIdCache.disableLocal();
+ sSlotIndexCache.disableLocal();
+ sPhoneIdCache.disableLocal();
+ }
+
+ /**
+ * Clears all process-local binder caches.
+ *
+ * @hide */
+ public static void clearCaches() {
+ sDefaultSubIdCache.clear();
+ sDefaultDataSubIdCache.clear();
+ sActiveDataSubIdCache.clear();
+ sDefaultSmsSubIdCache.clear();
+ sSlotIndexCache.clear();
+ sPhoneIdCache.clear();
}
}