diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-02 01:07:59 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-02 01:07:59 +0000 |
commit | e2522d38979df86e61f5be3af56b00fb937a2f49 (patch) | |
tree | 2f433854d0632a62db9173fde84bf5c605d0dee2 | |
parent | 3dcb2450e422f6b0c07ceca25842debb0a2322a5 (diff) | |
parent | 2e13ec53fb7e9a6f82bdab316e6ec36d85b59e5d (diff) | |
download | ImsServiceEntitlement-e2522d38979df86e61f5be3af56b00fb937a2f49.tar.gz |
Snap for 7414767 from 2e13ec53fb7e9a6f82bdab316e6ec36d85b59e5d to sc-d1-release
Change-Id: I875f10f84a5015dfc5777215cffb6d9591ecd990
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(); } |