summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2021-06-02 01:07:59 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2021-06-02 01:07:59 +0000
commite2522d38979df86e61f5be3af56b00fb937a2f49 (patch)
tree2f433854d0632a62db9173fde84bf5c605d0dee2
parent3dcb2450e422f6b0c07ceca25842debb0a2322a5 (diff)
parent2e13ec53fb7e9a6f82bdab316e6ec36d85b59e5d (diff)
downloadImsServiceEntitlement-e2522d38979df86e61f5be3af56b00fb937a2f49.tar.gz
Snap for 7414767 from 2e13ec53fb7e9a6f82bdab316e6ec36d85b59e5d to sc-d1-release
Change-Id: I875f10f84a5015dfc5777215cffb6d9591ecd990
-rw-r--r--AndroidManifest.xml8
-rw-r--r--src/com/android/imsserviceentitlement/ImsEntitlementApi.java19
-rw-r--r--src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java123
-rw-r--r--src/com/android/imsserviceentitlement/WfcActivationController.java10
-rw-r--r--src/com/android/imsserviceentitlement/WfcWebPortalFragment.java5
-rw-r--r--src/com/android/imsserviceentitlement/entitlement/EntitlementResult.java65
-rw-r--r--src/com/android/imsserviceentitlement/entitlement/VowifiStatus.java32
-rw-r--r--src/com/android/imsserviceentitlement/fcm/FcmService.java6
-rw-r--r--src/com/android/imsserviceentitlement/job/JobManager.java6
-rw-r--r--src/com/android/imsserviceentitlement/ts43/Ts43SmsOverIpStatus.java78
-rw-r--r--src/com/android/imsserviceentitlement/ts43/Ts43VolteStatus.java78
-rw-r--r--src/com/android/imsserviceentitlement/ts43/Ts43VowifiStatus.java22
-rw-r--r--src/com/android/imsserviceentitlement/utils/ImsUtils.java77
-rw-r--r--src/com/android/imsserviceentitlement/utils/TelephonyUtils.java2
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java111
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementPollingServiceTest.java154
16 files changed, 612 insertions, 184 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b0f6a41..b0599fd 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,7 +27,7 @@
<uses-permission android:name="com.google.android.setupwizard.SETUP_COMPAT_SERVICE"/>
<application
- android:appComponentFactory="android.support.v4.app.CoreComponentFactory"
+ android:appComponentFactory="androidx.core.app.CoreComponentFactory"
tools:replace="android:appComponentFactory">
<activity
@@ -37,6 +37,12 @@
android:theme="@style/SudThemeGlif.Light">
</activity>
+ <service
+ android:name=".ImsEntitlementPollingService"
+ android:exported="true"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
<!-- START: FCM related components -->
<!-- The FcmReceiver is in GMS client lib; need to declare it here to receive FCM. -->
<receiver
diff --git a/src/com/android/imsserviceentitlement/ImsEntitlementApi.java b/src/com/android/imsserviceentitlement/ImsEntitlementApi.java
index c5c09cb..bbf6c6e 100644
--- a/src/com/android/imsserviceentitlement/ImsEntitlementApi.java
+++ b/src/com/android/imsserviceentitlement/ImsEntitlementApi.java
@@ -28,6 +28,8 @@ import com.android.imsserviceentitlement.fcm.FcmTokenStore;
import com.android.imsserviceentitlement.fcm.FcmUtils;
import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlAttributes;
import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlNode;
+import com.android.imsserviceentitlement.ts43.Ts43SmsOverIpStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VolteStatus;
import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus;
import com.android.imsserviceentitlement.utils.TelephonyUtils;
import com.android.imsserviceentitlement.utils.XmlDoc;
@@ -51,11 +53,13 @@ public class ImsEntitlementApi {
private final EntitlementConfiguration mLastEntitlementConfiguration;
private int mRetryFullAuthenticationCount = AUTHENTICATION_RETRIES;
+ private boolean mNeedsImsProvisioning;
public ImsEntitlementApi(Context context, int subId) {
this.mContext = context;
this.mSubId = subId;
CarrierConfig carrierConfig = getCarrierConfig(context);
+ this.mNeedsImsProvisioning = TelephonyUtils.isImsProvisioningRequired(context, subId);
this.mServiceEntitlement = new ServiceEntitlement(context, carrierConfig, subId);
this.mLastEntitlementConfiguration = new EntitlementConfiguration(context, subId);
}
@@ -64,10 +68,12 @@ public class ImsEntitlementApi {
ImsEntitlementApi(
Context context,
int subId,
+ boolean needsImsProvisioning,
ServiceEntitlement serviceEntitlement,
EntitlementConfiguration lastEntitlementConfiguration) {
this.mContext = context;
this.mSubId = subId;
+ this.mNeedsImsProvisioning = needsImsProvisioning;
this.mServiceEntitlement = serviceEntitlement;
this.mLastEntitlementConfiguration = lastEntitlementConfiguration;
}
@@ -95,7 +101,13 @@ public class ImsEntitlementApi {
try {
String rawXml = mServiceEntitlement.queryEntitlementStatus(
- ImmutableList.of(ServiceEntitlement.APP_VOWIFI), request);
+ mNeedsImsProvisioning
+ ? ImmutableList.of(
+ ServiceEntitlement.APP_VOWIFI,
+ ServiceEntitlement.APP_VOLTE,
+ ServiceEntitlement.APP_SMSOIP)
+ : ImmutableList.of(ServiceEntitlement.APP_VOWIFI),
+ request);
entitlementXmlDoc = new XmlDoc(rawXml);
mLastEntitlementConfiguration.update(rawXml);
// Reset the retry count if no exception from queryEntitlementStatus()
@@ -122,8 +134,9 @@ public class ImsEntitlementApi {
private static EntitlementResult toEntitlementResult(XmlDoc doc) {
EntitlementResult.Builder builder =
EntitlementResult.builder()
- .setSuccess(true)
- .setVowifiStatus(Ts43VowifiStatus.builder(doc).build());
+ .setVowifiStatus(Ts43VowifiStatus.builder(doc).build())
+ .setVolteStatus(Ts43VolteStatus.builder(doc).build())
+ .setSmsoveripStatus(Ts43SmsOverIpStatus.builder(doc).build());
doc.get(
ResponseXmlNode.APPLICATION,
ResponseXmlAttributes.SERVER_FLOW_URL,
diff --git a/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java b/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java
index af9ab8a..d5c834b 100644
--- a/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java
+++ b/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java
@@ -24,6 +24,8 @@ import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IM
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__POLLING;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__SMSOIP;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOLTE;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI;
import android.app.job.JobParameters;
@@ -55,7 +57,7 @@ public class ImsEntitlementPollingService extends JobService {
public static final ComponentName COMPONENT_NAME =
ComponentName.unflattenFromString(
- "com.android.imsserviceentitlement/ImsEntitlementPollingService");
+ "com.android.imsserviceentitlement/.ImsEntitlementPollingService");
private ImsEntitlementApi mImsEntitlementApi;
@@ -78,6 +80,15 @@ public class ImsEntitlementPollingService extends JobService {
this.mImsEntitlementApi = imsEntitlementApi;
}
+ /** Enqueues a job to query entitlement status. */
+ public static void enqueueJob(Context context, int subId, int retryCount) {
+ JobManager.getInstance(
+ context,
+ COMPONENT_NAME,
+ subId)
+ .queryEntitlementStatusOnceNetworkReady(retryCount);
+ }
+
@Override
public boolean onStartJob(final JobParameters params) {
PersistableBundle bundle = params.getExtras();
@@ -122,17 +133,24 @@ public class ImsEntitlementPollingService extends JobService {
private final ImsEntitlementApi mImsEntitlementApi;
private final ImsUtils mImsUtils;
private final TelephonyUtils mTelephonyUtils;
+ private final int mSubid;
+ private final boolean mNeedsImsProvisioning;
// States for metrics
private long mStartTime;
private long mDurationMillis;
private int mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE;
- private int mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT;
+ private int mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT;
+ private int mVolteResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT;
+ private int mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT;
EntitlementPollingTask(final JobParameters params, int subId) {
this.mParams = params;
this.mImsUtils = ImsUtils.getInstance(ImsEntitlementPollingService.this, subId);
this.mTelephonyUtils = new TelephonyUtils(ImsEntitlementPollingService.this, subId);
+ this.mSubid = subId;
+ this.mNeedsImsProvisioning = TelephonyUtils.isImsProvisioningRequired(
+ ImsEntitlementPollingService.this, mSubid);
this.mImsEntitlementApi = ImsEntitlementPollingService.this.mImsEntitlementApi != null
? ImsEntitlementPollingService.this.mImsEntitlementApi
: new ImsEntitlementApi(ImsEntitlementPollingService.this, subId);
@@ -143,9 +161,9 @@ public class ImsEntitlementPollingService extends JobService {
mStartTime = mTelephonyUtils.getUptimeMillis();
int jobId = JobManager.getPureJobId(mParams.getJobId());
switch (jobId) {
- case JobManager.QUERY_ENTITLEMEN_STATUS_JOB_ID:
+ case JobManager.QUERY_ENTITLEMENT_STATUS_JOB_ID:
mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__POLLING;
- doWfcEntitlementCheck();
+ doEntitlementCheck();
break;
default:
break;
@@ -165,6 +183,51 @@ public class ImsEntitlementPollingService extends JobService {
sendStatsLogToMetrics();
}
+ private void doEntitlementCheck() {
+ if (mNeedsImsProvisioning) {
+ doImsEntitlementCheck();
+ } else {
+ doWfcEntitlementCheck();
+ }
+ }
+
+ @WorkerThread
+ private void doImsEntitlementCheck() {
+ try {
+ EntitlementResult result = mImsEntitlementApi.checkEntitlementStatus();
+ Log.d(TAG, "Entitlement result: " + result);
+
+ if (shouldTurnOffWfc(result)) {
+ mImsUtils.setVowifiProvisioned(false);
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
+ } else {
+ mImsUtils.setVowifiProvisioned(true);
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED;
+ }
+
+ if (shouldTurnOffVolte(result)) {
+ mImsUtils.setVolteProvisioned(false);
+ mVolteResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
+ } else {
+ mImsUtils.setVolteProvisioned(true);
+ mVolteResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED;
+ }
+
+ if (shouldTurnOffSMSoIP(result)) {
+ mImsUtils.setSmsoipProvisioned(false);
+ mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
+ } else {
+ mImsUtils.setSmsoipProvisioned(true);
+ mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED;
+ }
+ } catch (RuntimeException e) {
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
+ mVolteResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
+ mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
+ Log.d(TAG, "checkEntitlementStatus failed.", e);
+ }
+ }
+
@WorkerThread
private void doWfcEntitlementCheck() {
if (!mImsUtils.isWfcEnabledByUser()) {
@@ -175,13 +238,13 @@ public class ImsEntitlementPollingService extends JobService {
EntitlementResult result = mImsEntitlementApi.checkEntitlementStatus();
Log.d(TAG, "Entitlement result: " + result);
if (shouldTurnOffWfc(result)) {
- mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
mImsUtils.disableWfc();
} else {
- mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED;
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED;
}
} catch (RuntimeException e) {
- mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
Log.d(TAG, "checkEntitlementStatus failed.", e);
}
}
@@ -202,20 +265,58 @@ public class ImsEntitlementPollingService extends JobService {
|| result.getVowifiStatus().incompatible();
}
+ private boolean shouldTurnOffVolte(@Nullable EntitlementResult result) {
+ if (result == null) {
+ Log.d(TAG, "Entitlement API failed to return a result; don't turn off VoLTE.");
+ return false;
+ }
+
+ // Only turn off VoLTE for known patterns indicating VoLTE not activated.
+ return !result.getVolteStatus().isActive();
+ }
+
+ private boolean shouldTurnOffSMSoIP(@Nullable EntitlementResult result) {
+ if (result == null) {
+ Log.d(TAG, "Entitlement API failed to return a result; don't turn off SMSoIP.");
+ return false;
+ }
+
+ // Only turn off SMSoIP for known patterns indicating SMSoIP not activated.
+ return !result.getSmsoveripStatus().isActive();
+ }
+
private void sendStatsLogToMetrics() {
mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime;
// If no result set, it was cancelled for reasons.
- if (mAppResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
- mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
+ if (mVowifiResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
+ mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
+ }
+ writeStateLogByApps(
+ IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI, mVowifiResult);
+
+ if (mNeedsImsProvisioning) {
+ if (mVolteResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
+ mVolteResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
+ }
+ if (mSmsoipResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
+ mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
+ }
+ writeStateLogByApps(
+ IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOLTE, mVolteResult);
+ writeStateLogByApps(
+ IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__SMSOIP, mSmsoipResult);
}
+ }
+
+ private void writeStateLogByApps(int appId, int appResult) {
ImsServiceEntitlementStatsLog.write(
IMS_SERVICE_ENTITLEMENT_UPDATED,
mTelephonyUtils.getCarrierId(),
mTelephonyUtils.getSpecificCarrierId(),
mPurpose,
- IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI,
- mAppResult,
+ appId,
+ appResult,
mDurationMillis);
}
}
diff --git a/src/com/android/imsserviceentitlement/WfcActivationController.java b/src/com/android/imsserviceentitlement/WfcActivationController.java
index 4ffbcb7..bb25278 100644
--- a/src/com/android/imsserviceentitlement/WfcActivationController.java
+++ b/src/com/android/imsserviceentitlement/WfcActivationController.java
@@ -42,7 +42,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import com.android.imsserviceentitlement.entitlement.EntitlementResult;
-import com.android.imsserviceentitlement.entitlement.VowifiStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus;
import com.android.imsserviceentitlement.utils.ImsUtils;
import com.android.imsserviceentitlement.utils.TelephonyUtils;
@@ -230,7 +230,7 @@ public class WfcActivationController {
@MainThread
private void handleEntitlementStatusForActivation(EntitlementResult result) {
- VowifiStatus vowifiStatus = result.getVowifiStatus();
+ Ts43VowifiStatus vowifiStatus = result.getVowifiStatus();
if (vowifiStatus.vowifiEntitled()) {
finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL);
mActivationUi.setResultAndFinish(Activity.RESULT_OK);
@@ -257,7 +257,7 @@ public class WfcActivationController {
@MainThread
private void handleEntitlementStatusForUpdating(EntitlementResult result) {
- VowifiStatus vowifiStatus = result.getVowifiStatus();
+ Ts43VowifiStatus vowifiStatus = result.getVowifiStatus();
if (vowifiStatus.vowifiEntitled()) {
int launchIntention = ActivityConstants.getLaunchIntention(mStartIntent);
if (launchIntention == ActivityConstants.LAUNCH_APP_SHOW_TC) {
@@ -298,7 +298,7 @@ public class WfcActivationController {
@MainThread
private void handleEntitlementStatusAfterActivation(EntitlementResult result) {
- VowifiStatus vowifiStatus = result.getVowifiStatus();
+ Ts43VowifiStatus vowifiStatus = result.getVowifiStatus();
if (vowifiStatus.vowifiEntitled()) {
mActivationUi.setResultAndFinish(Activity.RESULT_OK);
finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL);
@@ -330,7 +330,7 @@ public class WfcActivationController {
@MainThread
private void handleEntitlementStatusAfterUpdating(EntitlementResult result) {
- VowifiStatus vowifiStatus = result.getVowifiStatus();
+ Ts43VowifiStatus vowifiStatus = result.getVowifiStatus();
if (vowifiStatus.vowifiEntitled()) {
mActivationUi.setResultAndFinish(Activity.RESULT_OK);
finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL);
diff --git a/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java b/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java
index 8f3af88..984bf28 100644
--- a/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java
+++ b/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java
@@ -32,6 +32,7 @@ import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
+import java.util.concurrent.Executor;
/** A fragment of WebView to render WFC T&C and emergency address web portal */
public class WfcWebPortalFragment extends Fragment {
@@ -137,9 +138,11 @@ public class WfcWebPortalFragment extends Fragment {
/** Emergency address websheet javascript callback. */
private class JsInterface {
private final WfcActivationUi mUi;
+ private final Executor mMainExecutor;
JsInterface(Activity activity) {
mUi = (WfcActivationUi) activity;
+ mMainExecutor = activity.getMainExecutor();
}
/**
@@ -150,7 +153,7 @@ public class WfcWebPortalFragment extends Fragment {
public void entitlementChanged() {
Log.d(TAG, "#entitlementChanged");
mFinishFlow = true;
- mUi.getController().finishFlow();
+ mMainExecutor.execute(() -> mUi.getController().finishFlow());
}
/**
diff --git a/src/com/android/imsserviceentitlement/entitlement/EntitlementResult.java b/src/com/android/imsserviceentitlement/entitlement/EntitlementResult.java
index 70ff7f5..4bc430a 100644
--- a/src/com/android/imsserviceentitlement/entitlement/EntitlementResult.java
+++ b/src/com/android/imsserviceentitlement/entitlement/EntitlementResult.java
@@ -16,51 +16,50 @@
package com.android.imsserviceentitlement.entitlement;
+import com.android.imsserviceentitlement.ts43.Ts43SmsOverIpStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VolteStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus;
+
import com.google.auto.value.AutoValue;
/** The result of the entitlement status check. */
@AutoValue
public abstract class EntitlementResult {
- private static final VowifiStatus INACTIVE_VOWIFI_STATUS =
- new VowifiStatus() {
- @Override
- public boolean vowifiEntitled() {
- return false;
- }
-
- @Override
- public boolean serverDataMissing() {
- return false;
- }
+ private static final Ts43VowifiStatus INACTIVE_VOWIFI_STATUS =
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(Ts43VowifiStatus.EntitlementStatus.INCOMPATIBLE)
+ .setTcStatus(Ts43VowifiStatus.TcStatus.NOT_AVAILABLE)
+ .setAddrStatus(Ts43VowifiStatus.AddrStatus.NOT_AVAILABLE)
+ .setProvStatus(Ts43VowifiStatus.ProvStatus.NOT_PROVISIONED)
+ .build();
- @Override
- public boolean inProgress() {
- return true;
- }
+ private static final Ts43VolteStatus INACTIVE_VOLTE_STATUS =
+ Ts43VolteStatus.builder()
+ .setEntitlementStatus(Ts43VolteStatus.EntitlementStatus.INCOMPATIBLE)
+ .build();
- @Override
- public boolean incompatible() {
- return false;
- }
- };
+ private static final Ts43SmsOverIpStatus INACTIVE_SMSOVERIP_STATUS =
+ Ts43SmsOverIpStatus.builder()
+ .setEntitlementStatus(Ts43SmsOverIpStatus.EntitlementStatus.INCOMPATIBLE)
+ .build();
/** Returns a new {@link Builder} object. */
public static Builder builder() {
return new AutoValue_EntitlementResult.Builder()
- .setSuccess(false)
.setVowifiStatus(INACTIVE_VOWIFI_STATUS)
- .setPollInterval(0)
+ .setVolteStatus(INACTIVE_VOLTE_STATUS)
+ .setSmsoveripStatus(INACTIVE_SMSOVERIP_STATUS)
.setEmergencyAddressWebUrl("")
.setEmergencyAddressWebData("")
.setTermsAndConditionsWebUrl("");
}
- /** Indicates this entitlement query succeeded or failed. */
- public abstract boolean isSuccess();
- /** The entitlement and service status of Vowifi. */
- public abstract VowifiStatus getVowifiStatus();
- /** The interval for scheduling polling job. */
- public abstract int getPollInterval();
+ /** The entitlement and service status of VoWiFi. */
+ public abstract Ts43VowifiStatus getVowifiStatus();
+ /** The entitlement and service status of VoLTE. */
+ public abstract Ts43VolteStatus getVolteStatus();
+ /** The entitlement and service status of SMSoIP. */
+ public abstract Ts43SmsOverIpStatus getSmsoveripStatus();
/** The URL to the WFC emergency address web form. */
public abstract String getEmergencyAddressWebUrl();
/** The data associated with the POST request to the WFC emergency address web form. */
@@ -72,9 +71,9 @@ public abstract class EntitlementResult {
@AutoValue.Builder
public abstract static class Builder {
public abstract EntitlementResult build();
- public abstract Builder setSuccess(boolean success);
- public abstract Builder setVowifiStatus(VowifiStatus vowifiStatus);
- public abstract Builder setPollInterval(int pollInterval);
+ public abstract Builder setVowifiStatus(Ts43VowifiStatus vowifiStatus);
+ public abstract Builder setVolteStatus(Ts43VolteStatus volteStatus);
+ public abstract Builder setSmsoveripStatus(Ts43SmsOverIpStatus smsoveripStatus);
public abstract Builder setEmergencyAddressWebUrl(String emergencyAddressWebUrl);
public abstract Builder setEmergencyAddressWebData(String emergencyAddressWebData);
public abstract Builder setTermsAndConditionsWebUrl(String termsAndConditionsWebUrl);
@@ -83,11 +82,11 @@ public abstract class EntitlementResult {
@Override
public final String toString() {
StringBuilder builder = new StringBuilder("EntitlementResult{");
- builder.append("isSuccess=").append(isSuccess());
builder.append(",getVowifiStatus=").append(getVowifiStatus());
+ builder.append(",getVolteStatus=").append(getVolteStatus());
+ builder.append(",getSmsoveripStatus=").append(getSmsoveripStatus());
builder.append(",getEmergencyAddressWebUrl=").append(opaque(getEmergencyAddressWebUrl()));
builder.append(",getEmergencyAddressWebData=").append(opaque(getEmergencyAddressWebData()));
- builder.append(",getPollInterval=").append(getPollInterval());
builder.append(",getTermsAndConditionsWebUrl=").append(getTermsAndConditionsWebUrl());
builder.append("}");
return builder.toString();
diff --git a/src/com/android/imsserviceentitlement/entitlement/VowifiStatus.java b/src/com/android/imsserviceentitlement/entitlement/VowifiStatus.java
deleted file mode 100644
index 440094d..0000000
--- a/src/com/android/imsserviceentitlement/entitlement/VowifiStatus.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.imsserviceentitlement.entitlement;
-
-/** Interfaces of retrieving the Vowifi entitlement statues. */
-public interface VowifiStatus {
- /** Returns {@code true} if vowifi service is available. */
- boolean vowifiEntitled();
-
- /** Returns {@code true} if the T&C or address needs to be updated. */
- boolean serverDataMissing();
-
- /** Returns {@code true} if the service is being provisioned. */
- boolean inProgress();
-
- /** Returns {@code true} if the service cannot be offered. */
- boolean incompatible();
-}
diff --git a/src/com/android/imsserviceentitlement/fcm/FcmService.java b/src/com/android/imsserviceentitlement/fcm/FcmService.java
index 161b9a4..9ab33fc 100644
--- a/src/com/android/imsserviceentitlement/fcm/FcmService.java
+++ b/src/com/android/imsserviceentitlement/fcm/FcmService.java
@@ -20,6 +20,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.util.Log;
+import com.android.imsserviceentitlement.ImsEntitlementPollingService;
import com.android.imsserviceentitlement.job.JobManager;
import com.android.imsserviceentitlement.utils.TelephonyUtils;
import com.android.libraries.entitlement.ServiceEntitlement;
@@ -34,8 +35,6 @@ import java.util.Map;
public class FcmService extends FirebaseMessagingService {
private static final String TAG = "IMSSE-FcmService";
- private static final String POLLING_SERVICE_COMPONENT_NAME =
- "com.android.imsserviceentitlement/.ImsEntitlementPollingService";
private static final String DATA_APP_KEY = "app";
private static final String DATA_TIMESTAMP_KEY = "timestamp";
@@ -120,7 +119,8 @@ public class FcmService extends FirebaseMessagingService {
? mJobManager
: JobManager.getInstance(
this,
- ComponentName.unflattenFromString(POLLING_SERVICE_COMPONENT_NAME), subId);
+ ImsEntitlementPollingService.COMPONENT_NAME,
+ subId);
}
private void scheduleEntitlementStatusCheckForSubIdAssociatedWithSenderId(String msgSenderId) {
diff --git a/src/com/android/imsserviceentitlement/job/JobManager.java b/src/com/android/imsserviceentitlement/job/JobManager.java
index ca3e208..b314ec1 100644
--- a/src/com/android/imsserviceentitlement/job/JobManager.java
+++ b/src/com/android/imsserviceentitlement/job/JobManager.java
@@ -37,7 +37,7 @@ public class JobManager {
private static final int JOB_ID_BASE_INDEX = 1000;
// Query entitlement status
- public static final int QUERY_ENTITLEMEN_STATUS_JOB_ID = 1;
+ public static final int QUERY_ENTITLEMENT_STATUS_JOB_ID = 1;
// Register FCM to listen push notification, this job not associated with subscription id.
public static final int REGISTER_FCM_JOB_ID = 2;
@@ -120,11 +120,11 @@ public class JobManager {
public void queryEntitlementStatusOnceNetworkReady(int retryCount) {
Log.d(
TAG,
- "schedule QUERY_ENTITLEMEN_STATUS_JOB_ID once has network connection, "
+ "schedule QUERY_ENTITLEMENT_STATUS_JOB_ID once has network connection, "
+ "retryCount="
+ retryCount);
JobInfo job =
- newJobInfoBuilder(QUERY_ENTITLEMEN_STATUS_JOB_ID, retryCount)
+ newJobInfoBuilder(QUERY_ENTITLEMENT_STATUS_JOB_ID, retryCount)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
mJobScheduler.schedule(job);
diff --git a/src/com/android/imsserviceentitlement/ts43/Ts43SmsOverIpStatus.java b/src/com/android/imsserviceentitlement/ts43/Ts43SmsOverIpStatus.java
new file mode 100644
index 0000000..cdbd435
--- /dev/null
+++ b/src/com/android/imsserviceentitlement/ts43/Ts43SmsOverIpStatus.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2021 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 com.android.imsserviceentitlement.ts43;
+
+import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlAttributes;
+import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlNode;
+import com.android.imsserviceentitlement.utils.XmlDoc;
+import com.android.libraries.entitlement.ServiceEntitlement;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * Implementation of SMSoIP entitlement status and server data availability for TS.43 entitlement
+ * solution. This class is only used to report the entitlement status of SMSoIP.
+ */
+@AutoValue
+public abstract class Ts43SmsOverIpStatus {
+ /** The entitlement status of SMSoIP service. */
+ public static class EntitlementStatus {
+ public EntitlementStatus() {}
+
+ public static final int DISABLED = 0;
+ public static final int ENABLED = 1;
+ public static final int INCOMPATIBLE = 2;
+ public static final int PROVISIONING = 3;
+ }
+
+ /** The entitlement status of SMSoIP service. */
+ public abstract int entitlementStatus();
+
+ public static Ts43SmsOverIpStatus.Builder builder() {
+ return new AutoValue_Ts43SmsOverIpStatus.Builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED);
+ }
+
+ public static Ts43SmsOverIpStatus.Builder builder(XmlDoc doc) {
+ return builder()
+ .setEntitlementStatus(
+ doc.get(ResponseXmlNode.APPLICATION,
+ ResponseXmlAttributes.ENTITLEMENT_STATUS,
+ ServiceEntitlement.APP_SMSOIP)
+ .map(status -> Integer.parseInt(status))
+ .orElse(EntitlementStatus.INCOMPATIBLE));
+ }
+
+ /** Builder of {@link Ts43SmsOverIpStatus}. */
+ @AutoValue.Builder
+ public abstract static class Builder {
+ public abstract Ts43SmsOverIpStatus build();
+
+ public abstract Builder setEntitlementStatus(int entitlementStatus);
+ }
+
+ public boolean isActive() {
+ return entitlementStatus() == EntitlementStatus.ENABLED;
+ }
+
+ public final String toString() {
+ return "Ts43SmsOverIpStatus {"
+ + "entitlementStatus="
+ + entitlementStatus()
+ + "}";
+ }
+}
diff --git a/src/com/android/imsserviceentitlement/ts43/Ts43VolteStatus.java b/src/com/android/imsserviceentitlement/ts43/Ts43VolteStatus.java
new file mode 100644
index 0000000..d324c22
--- /dev/null
+++ b/src/com/android/imsserviceentitlement/ts43/Ts43VolteStatus.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2021 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 com.android.imsserviceentitlement.ts43;
+
+import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlAttributes;
+import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlNode;
+import com.android.imsserviceentitlement.utils.XmlDoc;
+import com.android.libraries.entitlement.ServiceEntitlement;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * Implementation of Volte entitlement status and server data availability for TS.43 entitlement
+ * solution. This class is only used to report the entitlement status of Volte.
+ */
+@AutoValue
+public abstract class Ts43VolteStatus {
+ /** The entitlement status of Volte service. */
+ public static class EntitlementStatus {
+ public EntitlementStatus() {}
+
+ public static final int DISABLED = 0;
+ public static final int ENABLED = 1;
+ public static final int INCOMPATIBLE = 2;
+ public static final int PROVISIONING = 3;
+ }
+
+ /** The entitlement status of Volte service. */
+ public abstract int entitlementStatus();
+
+ public static Ts43VolteStatus.Builder builder() {
+ return new AutoValue_Ts43VolteStatus.Builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED);
+ }
+
+ public static Ts43VolteStatus.Builder builder(XmlDoc doc) {
+ return builder()
+ .setEntitlementStatus(
+ doc.get(ResponseXmlNode.APPLICATION,
+ ResponseXmlAttributes.ENTITLEMENT_STATUS,
+ ServiceEntitlement.APP_VOLTE)
+ .map(status -> Integer.parseInt(status))
+ .orElse(EntitlementStatus.INCOMPATIBLE));
+ }
+
+ /** Builder of {@link Ts43VolteStatus}. */
+ @AutoValue.Builder
+ public abstract static class Builder {
+ public abstract Ts43VolteStatus build();
+
+ public abstract Builder setEntitlementStatus(int entitlementStatus);
+ }
+
+ public boolean isActive() {
+ return entitlementStatus() == EntitlementStatus.ENABLED;
+ }
+
+ public final String toString() {
+ return "Ts43VolteStatus {"
+ + "entitlementStatus="
+ + entitlementStatus()
+ + "}";
+ }
+}
diff --git a/src/com/android/imsserviceentitlement/ts43/Ts43VowifiStatus.java b/src/com/android/imsserviceentitlement/ts43/Ts43VowifiStatus.java
index 146de87..b202102 100644
--- a/src/com/android/imsserviceentitlement/ts43/Ts43VowifiStatus.java
+++ b/src/com/android/imsserviceentitlement/ts43/Ts43VowifiStatus.java
@@ -16,9 +16,6 @@
package com.android.imsserviceentitlement.ts43;
-import androidx.annotation.VisibleForTesting;
-
-import com.android.imsserviceentitlement.entitlement.VowifiStatus;
import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlAttributes;
import com.android.imsserviceentitlement.ts43.Ts43Constants.ResponseXmlNode;
import com.android.imsserviceentitlement.utils.XmlDoc;
@@ -27,14 +24,12 @@ import com.android.libraries.entitlement.ServiceEntitlement;
import com.google.auto.value.AutoValue;
/**
- * Implementation of WFC entitlement status and server data availability for TS.43 entitlement
- * solution.
+ * Implementation of Vowifi entitlement status and server data availability for TS.43 entitlement
+ * solution. This class is only used to report the entitlement status of Vowifi.
*/
@AutoValue
-@VisibleForTesting
-public abstract class Ts43VowifiStatus implements VowifiStatus {
- /** The entitlement status of vowifi service. */
- @VisibleForTesting
+public abstract class Ts43VowifiStatus {
+ /** The entitlement status of Vowifi service. */
public static class EntitlementStatus {
public EntitlementStatus() {}
@@ -45,7 +40,6 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
}
/** The emergency address status of vowifi service. */
- @VisibleForTesting
public static class AddrStatus {
public AddrStatus() {}
@@ -56,7 +50,6 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
}
/** The terms and condition status of vowifi service. */
- @VisibleForTesting
public static class TcStatus {
public TcStatus() {}
@@ -67,7 +60,6 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
}
/** The provision status of vowifi service. */
- @VisibleForTesting
public static class ProvStatus {
public ProvStatus() {}
@@ -136,7 +128,6 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
public abstract Builder setProvStatus(int provStatus);
}
- @Override
public boolean vowifiEntitled() {
return entitlementStatus() == EntitlementStatus.ENABLED
&& (provStatus() == ProvStatus.PROVISIONED
@@ -146,14 +137,12 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
|| addrStatus() == AddrStatus.NOT_REQUIRED);
}
- @Override
public boolean serverDataMissing() {
return entitlementStatus() == EntitlementStatus.DISABLED
&& (tcStatus() == TcStatus.NOT_AVAILABLE
|| addrStatus() == AddrStatus.NOT_AVAILABLE);
}
- @Override
public boolean inProgress() {
return entitlementStatus() == EntitlementStatus.PROVISIONING
|| (entitlementStatus() == EntitlementStatus.DISABLED
@@ -166,7 +155,6 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
|| addrStatus() == AddrStatus.NOT_REQUIRED));
}
- @Override
public boolean incompatible() {
return entitlementStatus() == EntitlementStatus.INCOMPATIBLE;
}
@@ -184,4 +172,4 @@ public abstract class Ts43VowifiStatus implements VowifiStatus {
+ provStatus()
+ "}";
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/imsserviceentitlement/utils/ImsUtils.java b/src/com/android/imsserviceentitlement/utils/ImsUtils.java
index 1e0ff55..2ae94d8 100644
--- a/src/com/android/imsserviceentitlement/utils/ImsUtils.java
+++ b/src/com/android/imsserviceentitlement/utils/ImsUtils.java
@@ -21,6 +21,7 @@ import android.os.AsyncTask;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ProvisioningManager;
import android.util.Log;
import android.util.SparseArray;
@@ -33,8 +34,30 @@ public class ImsUtils {
private final CarrierConfigManager mCarrierConfigManager;
private final ImsMmTelManager mImsMmTelManager;
+ private final ProvisioningManager mProvisioningManager;
private final int mSubId;
+ /**
+ * Turns Volte provisioning status ON/OFF.
+ * Value is in Integer format. ON (1), OFF(0).
+ * Key is from {@link ProvisioningManager#KEY_VOLTE_PROVISIONING_STATUS}.
+ */
+ private static final int KEY_VOLTE_PROVISIONING_STATUS = 10;
+
+ /**
+ * Turns SMS over IP ON/OFF on the device.
+ * Value is in Integer format. ON (1), OFF(0).
+ * Key is from {@link ProvisioningManager#KEY_SMS_OVER_IP_ENABLED}.
+ */
+ private static final int KEY_SMS_OVER_IP_ENABLED = 14;
+
+ /**
+ * Enable voice over wifi on device.
+ * Value is in Integer format. Enabled (1), or Disabled (0).
+ * Key is from {@link ProvisioningManager#KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE}.
+ */
+ private static final int KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE = 28;
+
// Cache subscription id associated {@link ImsUtils} objects for reusing.
@GuardedBy("ImsUtils.class")
private static SparseArray<ImsUtils> sInstances = new SparseArray<ImsUtils>();
@@ -43,6 +66,7 @@ public class ImsUtils {
mCarrierConfigManager =
(CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
mImsMmTelManager = getImsMmTelManager(context, subId);
+ mProvisioningManager = getProvisioningManager(subId);
this.mSubId = subId;
}
@@ -70,6 +94,45 @@ public class ImsUtils {
}
}
+ /** Sets whether VoWiFi is provisioned. */
+ public void setVowifiProvisioned(boolean value) {
+ try {
+ mProvisioningManager.setProvisioningIntValue(
+ KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE, value
+ ? ProvisioningManager.PROVISIONING_VALUE_ENABLED
+ : ProvisioningManager.PROVISIONING_VALUE_DISABLED);
+ } catch (RuntimeException e) {
+ // ignore this exception, possible exception should be NullPointerException or
+ // RemoteException.
+ }
+ }
+
+ /** Sets whether Volte is provisioned. */
+ public void setVolteProvisioned(boolean value) {
+ try {
+ mProvisioningManager.setProvisioningIntValue(
+ KEY_VOLTE_PROVISIONING_STATUS, value
+ ? ProvisioningManager.PROVISIONING_VALUE_ENABLED
+ : ProvisioningManager.PROVISIONING_VALUE_DISABLED);
+ } catch (RuntimeException e) {
+ // ignore this exception, possible exception should be NullPointerException or
+ // RemoteException.
+ }
+ }
+
+ /** Sets whether SMSoIP is provisioned. */
+ public void setSmsoipProvisioned(boolean value) {
+ try {
+ mProvisioningManager.setProvisioningIntValue(
+ KEY_SMS_OVER_IP_ENABLED, value
+ ? ProvisioningManager.PROVISIONING_VALUE_ENABLED
+ : ProvisioningManager.PROVISIONING_VALUE_DISABLED);
+ } catch (RuntimeException e) {
+ // ignore this exception, possible exception should be NullPointerException or
+ // RemoteException.
+ }
+ }
+
/** Disables WFC and reset WFC mode to carrier default value */
public void disableAndResetVoWiFiImsSettings() {
try {
@@ -108,6 +171,20 @@ public class ImsUtils {
return null;
}
+ /**
+ * Returns {@link ProvisioningManager} with specific subscription id.
+ * Returns {@code null} if provided subscription id invalid.
+ */
+ @Nullable
+ public static ProvisioningManager getProvisioningManager(int subId) {
+ try {
+ return ProvisioningManager.createForSubscriptionId(subId);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Can't get ProvisioningManager, IllegalArgumentException: subId = " + subId);
+ }
+ return null;
+ }
+
/** Returns whether WFC is enabled by user for current subId */
public boolean isWfcEnabledByUser() {
try {
diff --git a/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java b/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java
index f6e51b4..2601fd8 100644
--- a/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java
+++ b/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java
@@ -163,7 +163,7 @@ public class TelephonyUtils {
* Returns true if app needs to do IMS (VoLTE/VoWiFi/SMSoIP) provisioning in the background
* or false if it doesn't need to do.
*/
- public static boolean getImsProvisioning(Context context, int subId) {
+ public static boolean isImsProvisioningRequired(Context context, int subId) {
return getConfigForSubId(context, subId).getBoolean(
CarrierConfigManager.ImsServiceEntitlement.KEY_IMS_PROVISIONING_BOOL,
false
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java
index dddeb58..5383114 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java
@@ -28,6 +28,8 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
@@ -35,6 +37,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.imsserviceentitlement.entitlement.EntitlementConfiguration;
import com.android.imsserviceentitlement.entitlement.EntitlementResult;
import com.android.imsserviceentitlement.fcm.FcmTokenStore;
+import com.android.imsserviceentitlement.utils.TelephonyUtils;
import com.android.libraries.entitlement.ServiceEntitlement;
import com.android.libraries.entitlement.ServiceEntitlementException;
import com.android.libraries.entitlement.ServiceEntitlementRequest;
@@ -46,14 +49,19 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@RunWith(AndroidJUnit4.class)
public class ImsEntitlementApiTest {
@Rule public final MockitoRule rule = MockitoJUnit.rule();
+
+ @Spy private Context mContext = ApplicationProvider.getApplicationContext();
+
@Mock private ServiceEntitlement mMockServiceEntitlement;
@Mock private EntitlementConfiguration mMockEntitlementConfiguration;
+ @Mock private CarrierConfigManager mCarrierConfigManager;
private static final int SUB_ID = 1;
private static final String FCM_TOKEN = "FCM_TOKEN";
@@ -88,7 +96,30 @@ public class ImsEntitlementApiTest {
+ " </characteristic>\n"
+ "</wap-provisioningdoc>\n";
- private final Context mContext = ApplicationProvider.getApplicationContext();
+ private static final String MULTIPLE_APPIDS_RAW_XML =
+ "<wap-provisioningdoc version=\"1.1\">\n"
+ + " <characteristic type=\"VERS\">\n"
+ + " <parm name=\"version\" value=\"1\"/>\n"
+ + " <parm name=\"validity\" value=\"1728000\"/>\n"
+ + " </characteristic>\n"
+ + " <characteristic type=\"TOKEN\">\n"
+ + " <parm name=\"token\" value=\"kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX\"/>\n"
+ + " <parm name=\"validity\" value=\"3600\"/>\n"
+ + " </characteristic>\n"
+ + " <characteristic type=\"APPLICATION\">\n"
+ + " <parm name=\"AppID\" value=\"ap2003\"/>\n"
+ + " <parm name=\"EntitlementStatus\" value=\"1\"/>\n"
+ + " </characteristic>\n"
+ + " <characteristic type=\"APPLICATION\">\n"
+ + " <parm name=\"AppID\" value=\"ap2004\"/>\n"
+ + " <parm name=\"EntitlementStatus\" value=\"1\"/>\n"
+ + " </characteristic>\n"
+ + " <characteristic type=\"APPLICATION\">\n"
+ + " <parm name=\"AppID\" value=\"ap2005\"/>\n"
+ + " <parm name=\"EntitlementStatus\" value=\"1\"/>\n"
+ + " </characteristic>\n"
+ + "</wap-provisioningdoc>\n";
+
private final EntitlementConfiguration mEntitlementConfiguration =
new EntitlementConfiguration(ApplicationProvider.getApplicationContext(), SUB_ID);
@@ -96,18 +127,15 @@ public class ImsEntitlementApiTest {
@Before
public void setUp() {
+ setImsProvisioningBool(true);
FcmTokenStore.setToken(mContext, SUB_ID, FCM_TOKEN);
- mImsEntitlementApi =
- new ImsEntitlementApi(
- mContext,
- SUB_ID,
- mMockServiceEntitlement,
- mEntitlementConfiguration);
mEntitlementConfiguration.reset();
}
@Test
public void checkEntitlementStatus_verifyVowifiStatus() throws Exception {
+ setImsProvisioningBool(false);
+ setupImsEntitlementApi(mEntitlementConfiguration);
when(mMockServiceEntitlement.queryEntitlementStatus(
eq(ImmutableList.of(ServiceEntitlement.APP_VOWIFI)), any())).thenReturn(RAW_XML);
@@ -117,7 +145,26 @@ public class ImsEntitlementApiTest {
}
@Test
+ public void checkEntitlementStatus_verifyImsAppsStatus() throws Exception {
+ setupImsEntitlementApi(mEntitlementConfiguration);
+ when(mMockServiceEntitlement.queryEntitlementStatus(
+ eq(ImmutableList.of(
+ ServiceEntitlement.APP_VOWIFI,
+ ServiceEntitlement.APP_VOLTE,
+ ServiceEntitlement.APP_SMSOIP)), any())
+ ).thenReturn(MULTIPLE_APPIDS_RAW_XML);
+
+ EntitlementResult result = mImsEntitlementApi.checkEntitlementStatus();
+
+ assertThat(result.getVowifiStatus().vowifiEntitled()).isTrue();
+ assertThat(result.getVolteStatus().isActive()).isTrue();
+ assertThat(result.getSmsoveripStatus().isActive()).isTrue();
+ }
+
+ @Test
public void checkEntitlementStatus_verifyConfigs() throws Exception {
+ setImsProvisioningBool(false);
+ setupImsEntitlementApi(mEntitlementConfiguration);
when(mMockServiceEntitlement.queryEntitlementStatus(
eq(ImmutableList.of(ServiceEntitlement.APP_VOWIFI)),
any())).thenReturn(RAW_XML);
@@ -136,6 +183,8 @@ public class ImsEntitlementApiTest {
@Test
public void checkEntitlementStatus_resultNull_verifyVowifiStatusAndConfigs() throws Exception {
+ setImsProvisioningBool(false);
+ setupImsEntitlementApi(mEntitlementConfiguration);
when(mMockServiceEntitlement.queryEntitlementStatus(
eq(ImmutableList.of(ServiceEntitlement.APP_VOWIFI)), any())).thenReturn(null);
@@ -152,19 +201,15 @@ public class ImsEntitlementApiTest {
@Test
public void checkEntitlementStatus_httpResponse511_dataStoreReset() throws Exception {
- ImsEntitlementApi imsEntitlementApi =
- new ImsEntitlementApi(
- mContext,
- SUB_ID,
- mMockServiceEntitlement,
- mMockEntitlementConfiguration);
+ setImsProvisioningBool(false);
+ setupImsEntitlementApi(mMockEntitlementConfiguration);
when(mMockServiceEntitlement.queryEntitlementStatus(
eq(ImmutableList.of(ServiceEntitlement.APP_VOWIFI)), any()))
.thenThrow(
new ServiceEntitlementException(
ERROR_HTTP_STATUS_NOT_SUCCESS, 511, "Invalid connection response"));
- EntitlementResult result = imsEntitlementApi.checkEntitlementStatus();
+ EntitlementResult result = mImsEntitlementApi.checkEntitlementStatus();
verify(mMockEntitlementConfiguration).reset();
assertThat(result).isNull();
@@ -172,27 +217,23 @@ public class ImsEntitlementApiTest {
@Test
public void checkEntitlementStatus_httpResponse511_fullAuthnDone() throws Exception {
- ImsEntitlementApi imsEntitlementApi =
- new ImsEntitlementApi(
- mContext,
- SUB_ID,
- mMockServiceEntitlement,
- mEntitlementConfiguration);
+ setImsProvisioningBool(false);
+ setupImsEntitlementApi(mEntitlementConfiguration);
mEntitlementConfiguration.update(RAW_XML);
// While perform fast-authn, throws exception with code 511
when(mMockServiceEntitlement.queryEntitlementStatus(
- eq(ImmutableList.of(ServiceEntitlement.APP_VOWIFI)),
- eq(authenticationRequest("kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX"))))
+ ImmutableList.of(ServiceEntitlement.APP_VOWIFI),
+ authenticationRequest("kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX")))
.thenThrow(
new ServiceEntitlementException(
ERROR_HTTP_STATUS_NOT_SUCCESS, 511, "Invalid connection response"));
// While perform full-authn, return the result
when(mMockServiceEntitlement.queryEntitlementStatus(
- eq(ImmutableList.of(ServiceEntitlement.APP_VOWIFI)),
- eq(authenticationRequest(null))))
+ ImmutableList.of(ServiceEntitlement.APP_VOWIFI),
+ authenticationRequest(null)))
.thenReturn(RAW_XML_NEW_TOKEN);
- EntitlementResult result = imsEntitlementApi.checkEntitlementStatus();
+ EntitlementResult result = mImsEntitlementApi.checkEntitlementStatus();
assertThat(result).isNotNull();
assertThat(mEntitlementConfiguration.getToken().get()).isEqualTo("NEW_TOKEN");
@@ -209,4 +250,24 @@ public class ImsEntitlementApiTest {
requestBuilder.setTerminalSoftwareVersion("versionZ");
return requestBuilder.build();
}
+
+ private void setupImsEntitlementApi(EntitlementConfiguration entitlementConfiguration) {
+ mImsEntitlementApi = new ImsEntitlementApi(
+ mContext,
+ SUB_ID,
+ TelephonyUtils.isImsProvisioningRequired(mContext, SUB_ID),
+ mMockServiceEntitlement,
+ entitlementConfiguration);
+ }
+
+ private void setImsProvisioningBool(boolean provisioning) {
+ PersistableBundle carrierConfig = new PersistableBundle();
+ carrierConfig.putBoolean(
+ CarrierConfigManager.ImsServiceEntitlement.KEY_IMS_PROVISIONING_BOOL,
+ provisioning
+ );
+ when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(carrierConfig);
+ when(mContext.getSystemService(CarrierConfigManager.class))
+ .thenReturn(mCarrierConfigManager);
+ }
}
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementPollingServiceTest.java b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementPollingServiceTest.java
index 1bf05d4..6dc333c 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementPollingServiceTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementPollingServiceTest.java
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.when;
import android.app.job.JobParameters;
import android.content.Context;
import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.util.SparseArray;
@@ -31,8 +32,14 @@ import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
import com.android.imsserviceentitlement.entitlement.EntitlementResult;
-import com.android.imsserviceentitlement.entitlement.VowifiStatus;
import com.android.imsserviceentitlement.job.JobManager;
+import com.android.imsserviceentitlement.ts43.Ts43SmsOverIpStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VolteStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.AddrStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.EntitlementStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.ProvStatus;
+import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.TcStatus;
import com.android.imsserviceentitlement.utils.ImsUtils;
import org.junit.Before;
@@ -57,6 +64,7 @@ public class ImsEntitlementPollingServiceTest {
@Mock private SubscriptionManager mSubscriptionManager;
@Mock private SubscriptionInfo mSubscriptionInfo;
@Mock private ImsEntitlementApi mImsEntitlementApi;
+ @Mock private CarrierConfigManager mCarrierConfigManager;
private ImsEntitlementPollingService mService;
@@ -74,6 +82,7 @@ public class ImsEntitlementPollingServiceTest {
setupImsUtils();
setJobParameters();
setWfcEnabledByUser(true);
+ setImsProvisioningBool(false);
}
@Test
@@ -109,6 +118,42 @@ public class ImsEntitlementPollingServiceTest {
verify(mImsUtils, never()).disableWfc();
}
+ @Test
+ public void doEntitlementCheck_shouldTurnOffImsApps_setAllProvisionedFalse() throws Exception {
+ setImsProvisioningBool(true);
+ EntitlementResult entitlementResult = getImsEntitlementResult(
+ sDisableVoWiFi,
+ sDisableVoLte,
+ sDisableSmsoverip
+ );
+ when(mImsEntitlementApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+
+ mService.onStartJob(mJobParameters);
+ mService.mOngoingTask.get(); // wait for job finish.
+
+ verify(mImsUtils).setVolteProvisioned(false);
+ verify(mImsUtils).setVowifiProvisioned(false);
+ verify(mImsUtils).setSmsoipProvisioned(false);
+ }
+
+ @Test
+ public void doEntitlementCheck_shouldTurnOnImsApps_setAllProvisionedTrue() throws Exception {
+ setImsProvisioningBool(true);
+ EntitlementResult entitlementResult = getImsEntitlementResult(
+ sEnableVoWiFi,
+ sEnableVoLte,
+ sEnableSmsoverip
+ );
+ when(mImsEntitlementApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+
+ mService.onStartJob(mJobParameters);
+ mService.mOngoingTask.get(); // wait for job finish.
+
+ verify(mImsUtils).setVolteProvisioned(true);
+ verify(mImsUtils).setVowifiProvisioned(true);
+ verify(mImsUtils).setSmsoipProvisioned(true);
+ }
+
private void setActivedSubscription() {
when(mSubscriptionInfo.getSimSlotIndex()).thenReturn(SLOT_ID);
when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mSubscriptionInfo);
@@ -133,59 +178,70 @@ public class ImsEntitlementPollingServiceTest {
bundle.putInt(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID);
bundle.putInt(JobManager.EXTRA_SLOT_ID, SLOT_ID);
when(mJobParameters.getExtras()).thenReturn(bundle);
- when(mJobParameters.getJobId()).thenReturn(JobManager.QUERY_ENTITLEMEN_STATUS_JOB_ID);
+ when(mJobParameters.getJobId()).thenReturn(JobManager.QUERY_ENTITLEMENT_STATUS_JOB_ID);
+ }
+
+ private void setImsProvisioningBool(boolean provisioning) {
+ PersistableBundle carrierConfig = new PersistableBundle();
+ carrierConfig.putBoolean(
+ CarrierConfigManager.ImsServiceEntitlement.KEY_IMS_PROVISIONING_BOOL,
+ provisioning
+ );
+ when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(carrierConfig);
+ when(mContext.getSystemService(CarrierConfigManager.class))
+ .thenReturn(mCarrierConfigManager);
+ }
+
+ private static EntitlementResult getEntitlementResult(Ts43VowifiStatus vowifiStatus) {
+ return EntitlementResult.builder()
+ .setVowifiStatus(vowifiStatus)
+ .build();
}
- private static EntitlementResult getEntitlementResult(VowifiStatus vowifiStatus) {
+ private static EntitlementResult getImsEntitlementResult(
+ Ts43VowifiStatus vowifiStatus,
+ Ts43VolteStatus volteStatus,
+ Ts43SmsOverIpStatus smsOverIpStatus) {
return EntitlementResult.builder()
- .setSuccess(true)
.setVowifiStatus(vowifiStatus)
+ .setVolteStatus(volteStatus)
+ .setSmsoveripStatus(smsOverIpStatus)
.build();
}
- private static final VowifiStatus sDisableVoWiFi =
- new VowifiStatus() {
- @Override
- public boolean vowifiEntitled() {
- return true;
- }
-
- @Override
- public boolean serverDataMissing() {
- return true;
- }
-
- @Override
- public boolean inProgress() {
- return true;
- }
-
- @Override
- public boolean incompatible() {
- return true;
- }
- };
-
- private static final VowifiStatus sEnableVoWiFi =
- new VowifiStatus() {
- @Override
- public boolean vowifiEntitled() {
- return true;
- }
-
- @Override
- public boolean serverDataMissing() {
- return false;
- }
-
- @Override
- public boolean inProgress() {
- return false;
- }
-
- @Override
- public boolean incompatible() {
- return false;
- }
- };
+ private static final Ts43VowifiStatus sDisableVoWiFi =
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .setTcStatus(TcStatus.NOT_AVAILABLE)
+ .setAddrStatus(AddrStatus.NOT_AVAILABLE)
+ .setProvStatus(ProvStatus.NOT_PROVISIONED)
+ .build();
+
+ private static final Ts43VowifiStatus sEnableVoWiFi =
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .setTcStatus(TcStatus.AVAILABLE)
+ .setAddrStatus(AddrStatus.AVAILABLE)
+ .setProvStatus(ProvStatus.PROVISIONED)
+ .build();
+
+ private static final Ts43VolteStatus sDisableVoLte =
+ Ts43VolteStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .build();
+
+ private static final Ts43VolteStatus sEnableVoLte =
+ Ts43VolteStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .build();
+
+ private static final Ts43SmsOverIpStatus sDisableSmsoverip =
+ Ts43SmsOverIpStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .build();
+
+ private static final Ts43SmsOverIpStatus sEnableSmsoverip =
+ Ts43SmsOverIpStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .build();
}