summaryrefslogtreecommitdiffstats
path: root/src/android/support/v7/mms/MmsManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/support/v7/mms/MmsManager.java')
-rw-r--r--src/android/support/v7/mms/MmsManager.java256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/android/support/v7/mms/MmsManager.java b/src/android/support/v7/mms/MmsManager.java
new file mode 100644
index 0000000..f9c0a91
--- /dev/null
+++ b/src/android/support/v7/mms/MmsManager.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2015 The Android Open Source 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 android.support.v7.mms;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.telephony.SmsManager;
+import android.util.SparseArray;
+
+/**
+ * The public interface of MMS library
+ */
+public class MmsManager {
+ /**
+ * Default subscription ID
+ */
+ public static final int DEFAULT_SUB_ID = -1;
+
+ // Whether to force legacy MMS sending
+ private static volatile boolean sForceLegacyMms = false;
+
+ // Cached computed overrides for carrier configuration values
+ private static SparseArray<Bundle> sConfigOverridesMap = new SparseArray<>();
+
+ /**
+ * Set the flag about whether to force to use legacy system APIs instead of system MMS API
+ *
+ * @param forceLegacyMms value to set
+ */
+ public static void setForceLegacyMms(boolean forceLegacyMms) {
+ sForceLegacyMms = forceLegacyMms;
+ }
+
+ /**
+ * Set the size of thread pool for request execution.
+ *
+ * Default is 4
+ *
+ * Note: if system MMS API is used, this has no effect
+ *
+ * @param size thread pool size
+ */
+ public static void setThreadPoolSize(int size) {
+ MmsService.setThreadPoolSize(size);
+ }
+
+ /**
+ * Set whether to use wake lock while sending or downloading MMS.
+ *
+ * Default value is true
+ *
+ * Note: if system MMS API is used, this has no effect
+ *
+ * @param useWakeLock true to use wake lock, false otherwise
+ */
+ public static void setUseWakeLock(final boolean useWakeLock) {
+ MmsService.setUseWakeLock(useWakeLock);
+ }
+
+ /**
+ * Set the optional carrier config values loader
+ *
+ * Note: if system MMS API is used, this is used to compute the overrides
+ * of carrier configuration values
+ *
+ * @param loader the carrier config values loader
+ */
+ public static void setCarrierConfigValuesLoader(CarrierConfigValuesLoader loader) {
+ if (loader == null) {
+ throw new IllegalArgumentException("Carrier configuration loader can not be empty");
+ }
+ synchronized (sConfigOverridesMap) {
+ MmsService.setCarrierConfigValuesLoader(loader);
+ sConfigOverridesMap.clear();
+ }
+ }
+
+ /**
+ * Set the optional APN settings loader
+ *
+ * Note: if system MMS API is used, this has no effect
+ *
+ * @param loader the APN settings loader
+ */
+ public static void setApnSettingsLoader(ApnSettingsLoader loader) {
+ if (loader == null) {
+ throw new IllegalArgumentException("APN settings loader can not be empty");
+ }
+ MmsService.setApnSettingsLoader(loader);
+ }
+
+ /**
+ * Set user agent info loader
+ *
+ * Note: if system MMS API is used, this is used to compute the overrides
+ * of carrier configuration values
+
+ * @param loader the user agent info loader
+ */
+ public static void setUserAgentInfoLoader(final UserAgentInfoLoader loader) {
+ if (loader == null) {
+ throw new IllegalArgumentException("User agent info loader can not be empty");
+ }
+ synchronized (sConfigOverridesMap) {
+ MmsService.setUserAgentInfoLoader(loader);
+ sConfigOverridesMap.clear();
+ }
+ }
+
+ /**
+ * Send MMS via platform MMS API (if platform supports and not forced to
+ * use legacy APIs) or legacy APIs
+ *
+ * @param subId the subscription ID of the SIM to use
+ * @param context the Context to use
+ * @param contentUri the content URI of the PDU to be sent
+ * @param locationUrl the optional location URL to use for sending
+ * @param sentIntent the pending intent for returning results
+ */
+ public static void sendMultimediaMessage(int subId, Context context, Uri contentUri,
+ String locationUrl, PendingIntent sentIntent) {
+ if (Utils.hasMmsApi() && !sForceLegacyMms) {
+ subId = Utils.getEffectiveSubscriptionId(subId);
+ final SmsManager smsManager = Utils.getSmsManager(subId);
+ smsManager.sendMultimediaMessage(context, contentUri, locationUrl,
+ getConfigOverrides(subId), sentIntent);
+ } else {
+ MmsService.startRequest(context, new SendRequest(locationUrl, contentUri, sentIntent));
+ }
+ }
+
+ /**
+ * Download MMS via platform MMS API (if platform supports and not forced to
+ * use legacy APIs) or legacy APIs
+ *
+ * @param subId the subscription ID of the SIM to use
+ * @param context the Context to use
+ * @param contentUri the content URI of the PDU to be sent
+ * @param locationUrl the optional location URL to use for sending
+ * @param downloadedIntent the pending intent for returning results
+ */
+ public static void downloadMultimediaMessage(int subId, Context context, String locationUrl,
+ Uri contentUri, PendingIntent downloadedIntent) {
+ if (Utils.hasMmsApi() && !sForceLegacyMms) {
+ subId = Utils.getEffectiveSubscriptionId(subId);
+ final SmsManager smsManager = Utils.getSmsManager(subId);
+ smsManager.downloadMultimediaMessage(context, locationUrl, contentUri,
+ getConfigOverrides(subId), downloadedIntent);
+ } else {
+ MmsService.startRequest(context,
+ new DownloadRequest(locationUrl, contentUri, downloadedIntent));
+ }
+ }
+
+ /**
+ * Get carrier configuration values overrides when platform MMS API is called.
+ * We only need to compute this if customized carrier config values loader or
+ * user agent info loader are set
+ *
+ * @param subId the ID of the SIM to use
+ * @return a Bundle containing the overrides
+ */
+ private static Bundle getConfigOverrides(final int subId) {
+ if (!Utils.hasMmsApi()) {
+ // If MMS API is not present, it is not necessary to compute overrides
+ return null;
+ }
+ Bundle overrides = null;
+ synchronized (sConfigOverridesMap) {
+ overrides = sConfigOverridesMap.get(subId);
+ if (overrides == null) {
+ overrides = new Bundle();
+ sConfigOverridesMap.put(subId, overrides);
+ computeOverridesLocked(subId, overrides);
+ }
+ }
+ return overrides;
+ }
+
+ /**
+ * Compute the overrides, incorporating the user agent info
+ *
+ * @param subId the subId of the SIM to use
+ * @param overrides the computed values overrides
+ */
+ private static void computeOverridesLocked(final int subId, final Bundle overrides) {
+ // Overrides not computed yet
+ final CarrierConfigValuesLoader carrierConfigValuesLoader =
+ MmsService.getCarrierConfigValuesLoader();
+ if (carrierConfigValuesLoader != null &&
+ !(carrierConfigValuesLoader instanceof DefaultCarrierConfigValuesLoader)) {
+ // Compute the overrides for carrier config values first if the config loader
+ // is not the default one.
+ final Bundle systemValues = Utils.getSmsManager(subId).getCarrierConfigValues();
+ final Bundle callerValues =
+ MmsService.getCarrierConfigValuesLoader().get(subId);
+ if (systemValues != null && callerValues != null) {
+ computeConfigDelta(systemValues, callerValues, overrides);
+ } else if (systemValues == null && callerValues != null) {
+ overrides.putAll(callerValues);
+ }
+ }
+ final UserAgentInfoLoader userAgentInfoLoader = MmsService.getUserAgentInfoLoader();
+ if (userAgentInfoLoader != null &&
+ !(userAgentInfoLoader instanceof DefaultUserAgentInfoLoader)) {
+ // Also set the user agent and ua prof url via the overrides
+ // if the user agent loader is not the default one.
+ overrides.putString(UserAgentInfoLoader.CONFIG_USER_AGENT,
+ userAgentInfoLoader.getUserAgent());
+ overrides.putString(UserAgentInfoLoader.CONFIG_UA_PROF_URL,
+ userAgentInfoLoader.getUAProfUrl());
+ }
+ }
+
+ /**
+ * Compute the delta between two sets of carrier configuration values: system and caller
+ *
+ * @param systemValues the system config values
+ * @param callerValues the caller's config values
+ * @param delta the delta of values (caller - system), using caller value to override system's
+ */
+ private static void computeConfigDelta(final Bundle systemValues, final Bundle callerValues,
+ final Bundle delta) {
+ for (final String key : callerValues.keySet()) {
+ final Object callerValue = callerValues.get(key);
+ final Object systemValue = systemValues.get(key);
+ if ((callerValue != null && systemValue != null && !callerValue.equals(systemValue)) ||
+ (callerValue != null && systemValue == null) ||
+ (callerValue == null && systemValue != null)) {
+ if (callerValue == null || callerValue instanceof String) {
+ delta.putString(key, (String) callerValue);
+ } else if (callerValue instanceof Integer) {
+ delta.putInt(key, (Integer) callerValue);
+ } else if (callerValue instanceof Boolean) {
+ delta.putBoolean(key, (Boolean) callerValue);
+ }
+ }
+ }
+ }
+}