summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-01 11:08:38 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-01 11:08:38 +0000
commit230936c585af5861da43ca65775bd5ca86491135 (patch)
treec808ab6cfae3569c951f33963e44187c93ec8188
parent821cdf081b6d29cf2663b7efa679df401295d4cb (diff)
parent149deb116a4cc2f3ec7e32e246797b03de7807d0 (diff)
downloadImsServiceEntitlement-230936c585af5861da43ca65775bd5ca86491135.tar.gz
Snap for 9550355 from 149deb116a4cc2f3ec7e32e246797b03de7807d0 to sdk-releaseplatform-tools-34.0.0platform-tools-33.0.4
Change-Id: I25a6faf0734d014e479e3384417eaf7c72c4d7f2
-rwxr-xr-xcoverage.sh102
-rw-r--r--src/com/android/imsserviceentitlement/ImsEntitlementApi.java13
-rw-r--r--src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java26
-rw-r--r--src/com/android/imsserviceentitlement/WfcActivationController.java69
-rw-r--r--src/com/android/imsserviceentitlement/WfcWebPortalFragment.java3
-rw-r--r--src/com/android/imsserviceentitlement/debug/DebugUtils.java10
-rw-r--r--src/com/android/imsserviceentitlement/entitlement/EntitlementConfiguration.java12
-rw-r--r--src/com/android/imsserviceentitlement/utils/ImsUtils.java54
-rw-r--r--src/com/android/imsserviceentitlement/utils/MetricsLogger.java54
-rw-r--r--src/com/android/imsserviceentitlement/utils/TelephonyUtils.java21
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java23
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java11
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java34
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java360
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/entitlement/EntitlementConfigurationTest.java27
-rw-r--r--tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java83
16 files changed, 746 insertions, 156 deletions
diff --git a/coverage.sh b/coverage.sh
new file mode 100755
index 0000000..f6c284f
--- /dev/null
+++ b/coverage.sh
@@ -0,0 +1,102 @@
+#!/usr/bin/env bash
+
+#
+# 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.
+#
+
+##### App specific parameters #####
+
+PACKAGE_NAME='com.android.imsserviceentitlement'
+MODULE_NAME='ImsServiceEntitlement'
+MODULE_PATH='packages/apps/ImsServiceEntitlement'
+
+TEST_PACKAGE='com.android.imsserviceentitlement.tests'
+TEST_MODULE_NAME='ImsServiceEntitlementUnitTests'
+TEST_MODULE_PATH='packages/apps/ImsServiceEntitlement/tests/unittests'
+TEST_MODULE_INSTALL_PATH="testcases/$TEST_MODULE_NAME/arm64/$TEST_MODULE_NAME.apk"
+TEST_RUNNER="$TEST_PACKAGE/androidx.test.runner.AndroidJUnitRunner"
+
+##### End app specific parameters #####
+
+if [[ $# != 0 && ! ($# == 1 && ($1 == "html" || $1 == "xml" || $1 == "csv")) ]]; then
+ echo "$0: usage: coverage.sh [REPORT_TYPE]"
+ echo "REPORT_TYPE [html | xml | csv] : the type of the report (default is html)"
+ exit 1
+fi
+
+REPORT_TYPE=${1:-html}
+
+if [ -z $ANDROID_BUILD_TOP ]; then
+ echo "You need to source and lunch before you can use this script"
+ exit 1
+fi
+
+REPORTER_JAR="$ANDROID_BUILD_TOP/out/soong/host/linux-x86/framework/jacoco-cli.jar"
+
+OUTPUT_DIR="$ANDROID_BUILD_TOP/out/coverage/$MODULE_NAME"
+
+echo "Running tests and generating coverage report"
+echo "Output dir: $OUTPUT_DIR"
+echo "Report type: $REPORT_TYPE"
+
+# location on the device to store coverage results, need to be accessible by the app
+REMOTE_COVERAGE_OUTPUT_FILE="/data/data/$PACKAGE_NAME/files/coverage.ec"
+
+COVERAGE_OUTPUT_FILE="$ANDROID_BUILD_TOP/out/$PACKAGE_NAME.ec"
+OUT_COMMON="$ANDROID_BUILD_TOP/out/target/common"
+COVERAGE_CLASS_FILE="$ANDROID_BUILD_TOP/out/soong/.intermediates/$MODULE_PATH/ImsServiceEntitlementLib/android_common/javac/ImsServiceEntitlementLib.jar"
+
+source $ANDROID_BUILD_TOP/build/envsetup.sh
+
+set -e # fail early
+
+echo ""
+echo "BUILDING TEST PACKAGE $TEST_PACKAGE_NAME"
+echo "============================================"
+(cd "$ANDROID_BUILD_TOP/$TEST_MODULE_PATH" && EMMA_INSTRUMENT=true EMMA_INSTRUMENT_STATIC=true mma -j32)
+echo "============================================"
+
+#set -x # print commands
+
+adb root
+adb wait-for-device
+
+adb shell rm -f "$REMOTE_COVERAGE_OUTPUT_FILE"
+
+adb install -r -g "$OUT/$TEST_MODULE_INSTALL_PATH"
+
+echo ""
+echo "RUNNING TESTS $TEST_RUNNER"
+echo "============================================"
+adb shell am instrument -e coverage true -e coverageFile "$REMOTE_COVERAGE_OUTPUT_FILE" -w "$TEST_RUNNER"
+echo "============================================"
+
+mkdir -p "$OUTPUT_DIR"
+
+adb pull "$REMOTE_COVERAGE_OUTPUT_FILE" "$COVERAGE_OUTPUT_FILE"
+
+java -jar "$REPORTER_JAR" \
+ report "$COVERAGE_OUTPUT_FILE" \
+ --$REPORT_TYPE "$OUTPUT_DIR" \
+ --classfiles "$COVERAGE_CLASS_FILE" \
+ --sourcefiles "$ANDROID_BUILD_TOP/$MODULE_PATH/src"
+
+#set +x
+
+# Echo the file as URI to quickly open the result using ctrl-click in terminal
+if [[ REPORT_TYPE == html ]] ; then
+ echo "COVERAGE RESULTS IN:"
+ echo "file://$OUTPUT_DIR/index.html"
+fi
diff --git a/src/com/android/imsserviceentitlement/ImsEntitlementApi.java b/src/com/android/imsserviceentitlement/ImsEntitlementApi.java
index 7a906fd..d6ccd65 100644
--- a/src/com/android/imsserviceentitlement/ImsEntitlementApi.java
+++ b/src/com/android/imsserviceentitlement/ImsEntitlementApi.java
@@ -26,6 +26,7 @@ import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import com.android.imsserviceentitlement.debug.DebugUtils;
import com.android.imsserviceentitlement.entitlement.EntitlementConfiguration;
import com.android.imsserviceentitlement.entitlement.EntitlementConfiguration.ClientBehavior;
import com.android.imsserviceentitlement.entitlement.EntitlementResult;
@@ -75,7 +76,13 @@ public class ImsEntitlementApi {
this.mSubId = subId;
CarrierConfig carrierConfig = getCarrierConfig(context);
this.mNeedsImsProvisioning = TelephonyUtils.isImsProvisioningRequired(context, subId);
- this.mServiceEntitlement = new ServiceEntitlement(context, carrierConfig, subId);
+ this.mServiceEntitlement =
+ new ServiceEntitlement(
+ context,
+ carrierConfig,
+ subId,
+ /* saveHttpHistory = */ false,
+ DebugUtils.getBypassEapAkaResponse());
this.mLastEntitlementConfiguration = new EntitlementConfiguration(context, subId);
}
@@ -112,8 +119,8 @@ public class ImsEntitlementApi {
requestBuilder.setTerminalSoftwareVersion("versionZ");
requestBuilder.setAcceptContentType(ServiceEntitlementRequest.ACCEPT_CONTENT_TYPE_XML);
if (mNeedsImsProvisioning) {
- mLastEntitlementConfiguration.getVersion().ifPresent(
- version -> requestBuilder.setConfigurationVersion(Integer.parseInt(version)));
+ requestBuilder.setConfigurationVersion(
+ Integer.parseInt(mLastEntitlementConfiguration.getVersion()));
}
ServiceEntitlementRequest request = requestBuilder.build();
diff --git a/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java b/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java
index bd9ab76..04a5750 100644
--- a/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java
+++ b/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java
@@ -16,7 +16,6 @@
package com.android.imsserviceentitlement;
-import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED;
@@ -47,6 +46,7 @@ import com.android.imsserviceentitlement.entitlement.EntitlementConfiguration.Cl
import com.android.imsserviceentitlement.entitlement.EntitlementResult;
import com.android.imsserviceentitlement.job.JobManager;
import com.android.imsserviceentitlement.utils.ImsUtils;
+import com.android.imsserviceentitlement.utils.MetricsLogger;
import com.android.imsserviceentitlement.utils.TelephonyUtils;
import java.time.Duration;
@@ -147,6 +147,7 @@ public class ImsEntitlementPollingService extends JobService {
private final ImsEntitlementApi mImsEntitlementApi;
private final ImsUtils mImsUtils;
private final TelephonyUtils mTelephonyUtils;
+ private final MetricsLogger mMetricsLogger;
private final int mSubid;
private final boolean mNeedsImsProvisioning;
@@ -168,15 +169,15 @@ public class ImsEntitlementPollingService extends JobService {
this.mImsEntitlementApi = ImsEntitlementPollingService.this.mImsEntitlementApi != null
? ImsEntitlementPollingService.this.mImsEntitlementApi
: new ImsEntitlementApi(ImsEntitlementPollingService.this, subId);
+ this.mMetricsLogger = new MetricsLogger(mTelephonyUtils);
}
@Override
protected Void doInBackground(Void... unused) {
- mStartTime = mTelephonyUtils.getUptimeMillis();
int jobId = JobManager.getPureJobId(mParams.getJobId());
switch (jobId) {
case JobManager.QUERY_ENTITLEMENT_STATUS_JOB_ID:
- mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__POLLING;
+ mMetricsLogger.start(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__POLLING);
doEntitlementCheck();
break;
default:
@@ -343,13 +344,11 @@ public class ImsEntitlementPollingService extends JobService {
}
private void sendStatsLogToMetrics() {
- mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime;
-
// If no result set, it was cancelled for reasons.
if (mVowifiResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
}
- writeStateLogByApps(
+ mMetricsLogger.write(
IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI, mVowifiResult);
if (mNeedsImsProvisioning) {
@@ -359,22 +358,11 @@ public class ImsEntitlementPollingService extends JobService {
if (mSmsoipResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
}
- writeStateLogByApps(
+ mMetricsLogger.write(
IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOLTE, mVolteResult);
- writeStateLogByApps(
+ mMetricsLogger.write(
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,
- appId,
- appResult,
- mDurationMillis);
- }
}
}
diff --git a/src/com/android/imsserviceentitlement/WfcActivationController.java b/src/com/android/imsserviceentitlement/WfcActivationController.java
index ed63bf9..6bcd9ec 100644
--- a/src/com/android/imsserviceentitlement/WfcActivationController.java
+++ b/src/com/android/imsserviceentitlement/WfcActivationController.java
@@ -16,7 +16,6 @@
package com.android.imsserviceentitlement;
-import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
@@ -26,7 +25,6 @@ import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IM
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNEXPECTED_RESULT;
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__ACTIVATION;
-import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UPDATE;
import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI;
@@ -44,8 +42,11 @@ import androidx.annotation.StringRes;
import com.android.imsserviceentitlement.entitlement.EntitlementResult;
import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus;
import com.android.imsserviceentitlement.utils.ImsUtils;
+import com.android.imsserviceentitlement.utils.MetricsLogger;
import com.android.imsserviceentitlement.utils.TelephonyUtils;
+import com.google.common.annotations.VisibleForTesting;
+
import java.time.Duration;
/**
@@ -67,14 +68,10 @@ public class WfcActivationController {
private final ImsEntitlementApi mImsEntitlementApi;
private final ImsUtils mImsUtils;
private final Intent mStartIntent;
+ private final MetricsLogger mMetricsLogger;
// States
private int mEvaluateTimes = 0;
-
- // 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;
@MainThread
@@ -88,6 +85,23 @@ public class WfcActivationController {
this.mImsEntitlementApi = imsEntitlementApi;
this.mTelephonyUtils = new TelephonyUtils(context, getSubId());
this.mImsUtils = ImsUtils.getInstance(context, getSubId());
+ this.mMetricsLogger = new MetricsLogger(mTelephonyUtils);
+ }
+
+ @VisibleForTesting
+ WfcActivationController(
+ Context context,
+ WfcActivationUi wfcActivationUi,
+ ImsEntitlementApi imsEntitlementApi,
+ Intent intent,
+ ImsUtils imsUtils,
+ MetricsLogger metricsLogger) {
+ this.mStartIntent = intent;
+ this.mActivationUi = wfcActivationUi;
+ this.mImsEntitlementApi = imsEntitlementApi;
+ this.mTelephonyUtils = new TelephonyUtils(context, getSubId());
+ this.mImsUtils = imsUtils;
+ this.mMetricsLogger = metricsLogger;
}
/** Indicates the controller to start WFC activation or emergency address update flow. */
@@ -96,11 +110,10 @@ public class WfcActivationController {
showGeneralWaitingUi();
evaluateEntitlementStatus();
if (isActivationFlow()) {
- mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION;
+ mMetricsLogger.start(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION);
} else {
- mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UPDATE;
+ mMetricsLogger.start(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UPDATE);
}
- mStartTime = mTelephonyUtils.getUptimeMillis();
}
/** Evaluates entitlement status for activation or update. */
@@ -141,22 +154,11 @@ public class WfcActivationController {
public void finish() {
EntitlementUtils.cancelEntitlementCheck();
- // If no duration set, set now.
- if (mDurationMillis == 0L) {
- mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime;
- }
// If no result set, it must be cancelled by user pressing back button.
if (mAppResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) {
mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED;
}
- ImsServiceEntitlementStatsLog.write(
- IMS_SERVICE_ENTITLEMENT_UPDATED,
- /* carrier_id= */ mTelephonyUtils.getCarrierId(),
- /* actual_carrier_id= */ mTelephonyUtils.getSpecificCarrierId(),
- mPurpose,
- IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI,
- mAppResult,
- mDurationMillis);
+ mMetricsLogger.write(IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI, mAppResult);
}
/**
@@ -268,9 +270,10 @@ public class WfcActivationController {
} else {
if (vowifiStatus.incompatible()) {
showErrorUi(R.string.failure_contact_carrier);
- turnOffWfc(() -> {
- finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__INCOMPATIBLE);
- });
+ mImsUtils.turnOffWfc(
+ () -> finishStatsLog(
+ IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__INCOMPATIBLE)
+ );
} else {
Log.e(TAG, "Unexpected status. Show error UI.");
finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNEXPECTED_RESULT);
@@ -334,10 +337,11 @@ public class WfcActivationController {
finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL);
} else if (vowifiStatus.serverDataMissing()) {
// Some carrier allows de-activating in updating flow.
- turnOffWfc(() -> {
- finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED);
- mActivationUi.setResultAndFinish(Activity.RESULT_OK);
- });
+ mImsUtils.turnOffWfc(
+ () -> {
+ finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED);
+ mActivationUi.setResultAndFinish(Activity.RESULT_OK);
+ });
} else {
Log.e(TAG, "Unexpected status. Show error UI.");
showGeneralErrorUi();
@@ -361,14 +365,7 @@ public class WfcActivationController {
}.start();
}
- /** Turns WFC off and then runs {@code action} on main thread. */
- @MainThread
- private void turnOffWfc(Runnable action) {
- ImsUtils.turnOffWfc(mImsUtils, action);
- }
-
private void finishStatsLog(int result) {
mAppResult = result;
- mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime;
}
}
diff --git a/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java b/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java
index 7249fc3..1619324 100644
--- a/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java
+++ b/src/com/android/imsserviceentitlement/WfcWebPortalFragment.java
@@ -95,6 +95,9 @@ public class WfcWebPortalFragment extends Fragment {
new OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
+ if (!v.hasFocus()) {
+ v.requestFocus();
+ }
}
@Override
diff --git a/src/com/android/imsserviceentitlement/debug/DebugUtils.java b/src/com/android/imsserviceentitlement/debug/DebugUtils.java
index 8936948..ddd71d6 100644
--- a/src/com/android/imsserviceentitlement/debug/DebugUtils.java
+++ b/src/com/android/imsserviceentitlement/debug/DebugUtils.java
@@ -25,6 +25,7 @@ import java.util.Optional;
/** Provides API for debugging and not allow to debug on user build. */
public final class DebugUtils {
private static final String PROP_PII_LOGGABLE = "dbg.imsse.pii_loggable";
+ private static final String PROP_BYPASS_EAP_AKA_RESPONSE = "dbg.imsse.bypass_eap_aka_response";
private static final String PROP_SERVER_URL_OVERRIDE = "persist.dbg.imsse.server_url";
private static final String BUILD_TYPE_USER = "user";
@@ -48,6 +49,15 @@ public final class DebugUtils {
return SystemProperties.getBoolean(PROP_PII_LOGGABLE, false);
}
+ /** Returns a non empty string if bypass EAP-AKA authentication is enabled. */
+ public static String getBypassEapAkaResponse() {
+ if (!isDebugBuild()) {
+ return "";
+ }
+
+ return SystemProperties.get(PROP_BYPASS_EAP_AKA_RESPONSE);
+ }
+
/**
* Returns {@link Optional} if testing server url was set in system property.
*/
diff --git a/src/com/android/imsserviceentitlement/entitlement/EntitlementConfiguration.java b/src/com/android/imsserviceentitlement/entitlement/EntitlementConfiguration.java
index c2c8abb..1aa92dd 100644
--- a/src/com/android/imsserviceentitlement/entitlement/EntitlementConfiguration.java
+++ b/src/com/android/imsserviceentitlement/entitlement/EntitlementConfiguration.java
@@ -131,9 +131,13 @@ public class EntitlementConfiguration {
.orElse(DEFAULT_VALIDITY);
}
- /** Returns version stored in the {@link EntitlementCharacteristicDataStore}. */
- public Optional<String> getVersion() {
- return mXmlDoc.get(ResponseXmlNode.VERS, ResponseXmlAttributes.VERSION, null);
+ /**
+ * Returns version stored in the {@link EntitlementCharacteristicDataStore}.
+ * If no data exists then return the default value {@link #DEFAULT_VERSION}.
+ */
+ public String getVersion() {
+ return mXmlDoc.get(ResponseXmlNode.VERS, ResponseXmlAttributes.VERSION, null)
+ .orElse(String.valueOf(DEFAULT_VERSION));
}
/**
@@ -229,7 +233,7 @@ public class EntitlementConfiguration {
String rawXml =
"<wap-provisioningdoc version=\"1.1\">"
+ " <characteristic type=\"VERS\">"
- + " <parm name=\"version\" value=\"" + getVersion().get() + "\"/>"
+ + " <parm name=\"version\" value=\"" + getVersion() + "\"/>"
+ " <parm name=\"validity\" value=\"" + getVersValidity() + "\"/>"
+ " </characteristic>"
+ " <characteristic type=\"TOKEN\">"
diff --git a/src/com/android/imsserviceentitlement/utils/ImsUtils.java b/src/com/android/imsserviceentitlement/utils/ImsUtils.java
index d03d8f8..5681afe 100644
--- a/src/com/android/imsserviceentitlement/utils/ImsUtils.java
+++ b/src/com/android/imsserviceentitlement/utils/ImsUtils.java
@@ -28,14 +28,15 @@ import android.util.SparseArray;
import androidx.annotation.GuardedBy;
import androidx.annotation.Nullable;
+import com.google.common.annotations.VisibleForTesting;
+
/** A helper class for IMS relevant APIs with subscription id. */
public class ImsUtils {
private static final String TAG = "IMSSE-ImsUtils";
- private final CarrierConfigManager mCarrierConfigManager;
+ @Nullable private final PersistableBundle mCarrierConfigs;
private final ImsMmTelManager mImsMmTelManager;
private final ProvisioningManager mProvisioningManager;
- private final int mSubId;
/**
* Turns Volte provisioning status ON/OFF.
@@ -63,11 +64,20 @@ public class ImsUtils {
private static SparseArray<ImsUtils> sInstances = new SparseArray<ImsUtils>();
private ImsUtils(Context context, int subId) {
- mCarrierConfigManager =
- (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
- mImsMmTelManager = getImsMmTelManager(context, subId);
- mProvisioningManager = getProvisioningManager(subId);
- this.mSubId = subId;
+ this(
+ context.getSystemService(CarrierConfigManager.class).getConfigForSubId(subId),
+ getImsMmTelManager(subId),
+ getProvisioningManager(subId));
+ }
+
+ @VisibleForTesting
+ ImsUtils(
+ PersistableBundle carrierConfigs,
+ ImsMmTelManager imsMmTelManager,
+ ProvisioningManager provisioningManager) {
+ mCarrierConfigs = carrierConfigs;
+ mImsMmTelManager = imsMmTelManager;
+ mProvisioningManager = provisioningManager;
}
/** Returns {@link ImsUtils} instance. */
@@ -83,7 +93,7 @@ public class ImsUtils {
}
/** Changes persistent WFC enabled setting. */
- public void setWfcSetting(boolean enabled) {
+ private void setWfcSetting(boolean enabled) {
try {
mImsMmTelManager.setVoWiFiSettingEnabled(enabled);
} catch (RuntimeException e) {
@@ -132,21 +142,19 @@ public class ImsUtils {
}
/** Disables WFC and reset WFC mode to carrier default value */
- public void disableAndResetVoWiFiImsSettings() {
+ @VisibleForTesting
+ void disableAndResetVoWiFiImsSettings() {
try {
disableWfc();
// Reset WFC mode to carrier default value
- if (mCarrierConfigManager != null) {
- PersistableBundle b = mCarrierConfigManager.getConfigForSubId(mSubId);
- if (b != null) {
- mImsMmTelManager.setVoWiFiModeSetting(
- b.getInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT));
- mImsMmTelManager.setVoWiFiRoamingModeSetting(
- b.getInt(
- CarrierConfigManager
- .KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT));
- }
+ if (mCarrierConfigs != null) {
+ mImsMmTelManager.setVoWiFiModeSetting(
+ mCarrierConfigs.getInt(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT));
+ mImsMmTelManager.setVoWiFiRoamingModeSetting(
+ mCarrierConfigs.getInt(
+ CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT));
}
} catch (RuntimeException e) {
// ignore this exception, possible exception should be NullPointerException or
@@ -159,7 +167,7 @@ public class ImsUtils {
* Returns {@code null} if provided subscription id invalid.
*/
@Nullable
- public static ImsMmTelManager getImsMmTelManager(Context context, int subId) {
+ private static ImsMmTelManager getImsMmTelManager(int subId) {
try {
return ImsMmTelManager.createForSubscriptionId(subId);
} catch (IllegalArgumentException e) {
@@ -174,7 +182,7 @@ public class ImsUtils {
* Returns {@code null} if provided subscription id invalid.
*/
@Nullable
- public static ProvisioningManager getProvisioningManager(int subId) {
+ private static ProvisioningManager getProvisioningManager(int subId) {
try {
return ProvisioningManager.createForSubscriptionId(subId);
} catch (IllegalArgumentException e) {
@@ -195,11 +203,11 @@ public class ImsUtils {
}
/** Calls {@link #disableAndResetVoWiFiImsSettings()} in background thread. */
- public static void turnOffWfc(ImsUtils imsUtils, Runnable action) {
+ public void turnOffWfc(Runnable action) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
- imsUtils.disableAndResetVoWiFiImsSettings();
+ disableAndResetVoWiFiImsSettings();
return null; // To satisfy compiler
}
diff --git a/src/com/android/imsserviceentitlement/utils/MetricsLogger.java b/src/com/android/imsserviceentitlement/utils/MetricsLogger.java
new file mode 100644
index 0000000..8eec246
--- /dev/null
+++ b/src/com/android/imsserviceentitlement/utils/MetricsLogger.java
@@ -0,0 +1,54 @@
+/*
+ * 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.utils;
+
+import static android.os.SystemClock.uptimeMillis;
+
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE;
+
+import com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog;
+
+/** Utility for writing the metrics logs. */
+public class MetricsLogger {
+ private final TelephonyUtils mTelephonyUtils;
+
+ private int mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE;
+ private long mStartTime = uptimeMillis();
+
+ public MetricsLogger(TelephonyUtils telephonyUtils) {
+ mTelephonyUtils = telephonyUtils;
+ }
+
+ /** Starts the log session for the purpose as well as record the start time. */
+ public void start(int purpose) {
+ mStartTime = uptimeMillis();
+ mPurpose = purpose;
+ }
+
+ /** Writes the metrics log. */
+ public void write(int appId, int appResult) {
+ ImsServiceEntitlementStatsLog.write(
+ IMS_SERVICE_ENTITLEMENT_UPDATED,
+ mTelephonyUtils.getCarrierId(),
+ mTelephonyUtils.getSpecificCarrierId(),
+ mPurpose,
+ appId,
+ appResult,
+ uptimeMillis() - mStartTime);
+ }
+}
diff --git a/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java b/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java
index e968c2f..62bc8d7 100644
--- a/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java
+++ b/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java
@@ -19,7 +19,6 @@ package com.android.imsserviceentitlement.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
-import android.os.Build;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
@@ -62,32 +61,12 @@ public class TelephonyUtils {
return android.os.SystemClock.uptimeMillis();
}
- /** Returns device model name. */
- public String getDeviceName() {
- return Build.MODEL;
- }
-
- /** Returns device OS version. */
- public String getDeviceOsVersion() {
- return Build.VERSION.RELEASE;
- }
-
/** Returns {@code true} if network is connected (cellular or WiFi). */
public boolean isNetworkConnected() {
NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnected();
}
- /**
- * Returns the response of EAP-AKA authetication {@code data} or {@code null} on failure.
- *
- * <p>Requires permission: READ_PRIVILEGED_PHONE_STATE
- */
- public String getEapAkaAuthentication(String data) {
- return mTelephonyManager.getIccAuthentication(
- TelephonyManager.APPTYPE_USIM, TelephonyManager.AUTHTYPE_EAP_AKA, data);
- }
-
/** Returns carrier ID. */
public int getCarrierId() {
return mTelephonyManager.getSimCarrierId();
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java b/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java
index 474e755..04477c9 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java
@@ -44,10 +44,8 @@ public class EntitlementUtilsTest {
@Mock private EntitlementResult mEntitlementResult;
@Before
- public void setup() throws Exception {
- Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest");
- field.setAccessible(true);
- field.set(null, true);
+ public void setUp() throws Exception {
+ useDirectExecutor(true);
}
@Test
@@ -67,4 +65,21 @@ public class EntitlementUtilsTest {
verify(mEntitlementResultCallback, never()).onEntitlementResult(mEntitlementResult);
}
+
+ @Test
+ public void entitlementCheck_cancelEntitlementCheck_onFailure() throws Exception {
+ useDirectExecutor(false);
+ when(mMockImsEntitlementApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+
+ EntitlementUtils.entitlementCheck(mMockImsEntitlementApi, mEntitlementResultCallback);
+ EntitlementUtils.cancelEntitlementCheck();
+
+ verify(mEntitlementResultCallback, never()).onEntitlementResult(mEntitlementResult);
+ }
+
+ private void useDirectExecutor(boolean enable) throws Exception {
+ Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest");
+ field.setAccessible(true);
+ field.set(null, enable);
+ }
}
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java
index d0ea3ee..217ac7b 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
@@ -296,6 +297,16 @@ public class ImsEntitlementApiTest {
assertThat(result.getRetryAfterSeconds()).isEqualTo(120);
}
+ @Test
+ public void checkEntitlementStatus_invalidSubId_resultNull() {
+ ImsEntitlementApi imsEntitlementApi =
+ new ImsEntitlementApi(mContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+
+ EntitlementResult result = imsEntitlementApi.checkEntitlementStatus();
+
+ assertThat(result).isNull();
+ }
+
private ServiceEntitlementRequest authenticationRequest(String token) {
ServiceEntitlementRequest.Builder requestBuilder = ServiceEntitlementRequest.builder();
if (token != null) {
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java
index 444db10..117745c 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java
@@ -32,6 +32,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.os.PersistableBundle;
import android.os.UserManager;
+import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
@@ -194,8 +195,6 @@ public class ImsEntitlementReceiverTest {
@Test
public void onReceive_isSystemUser_jobScheduled() {
- when(mMockUserManager.isSystemUser()).thenReturn(true);
-
mReceiver.onReceive(
mContext, getCarrierConfigChangedIntent(SUB_ID, /* slotId= */ 0));
@@ -204,9 +203,9 @@ public class ImsEntitlementReceiverTest {
@Test
public void onReceive_notSystemUser_noJobScheduled() {
- when(mMockUserManager.isSystemUser()).thenReturn(false);
+ ImsEntitlementReceiver receiver = new ImsEntitlementReceiver();
- mReceiver.onReceive(
+ receiver.onReceive(
mContext, getCarrierConfigChangedIntent(SUB_ID, /* slotId= */ 0));
verify(mMockJobManager, never()).queryEntitlementStatusOnceNetworkReady();
@@ -232,6 +231,27 @@ public class ImsEntitlementReceiverTest {
verify(mMockJobManager, never()).queryEntitlementStatusOnceNetworkReady();
}
+ @Test
+ public void onReceive_invalidSubId_noJobScheduled() {
+ mReceiver.onReceive(mContext,
+ getCarrierConfigChangedIntent(SubscriptionManager.INVALID_SUBSCRIPTION_ID, 0));
+
+ verify(mMockJobManager, never()).queryEntitlementStatusOnceNetworkReady();
+ }
+
+ @Test
+ public void isBootUp_compareWithLastBootCount_returnResult() {
+ int currentBootCount =
+ Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.BOOT_COUNT, /* def= */ -1);
+ setLastBootCount(/* slotId= */ 0, /* count=*/ currentBootCount);
+ setLastBootCount(/* slotId= */ 1, /* count=*/ currentBootCount - 1);
+ ImsEntitlementReceiver receiver = new ImsEntitlementReceiver();
+
+ assertThat(receiver.isBootUp(mContext, 0)).isFalse();
+ assertThat(receiver.isBootUp(mContext, 1)).isTrue();
+ }
+
private Intent getCarrierConfigChangedIntent(int subId, int slotId) {
Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
@@ -255,6 +275,12 @@ public class ImsEntitlementReceiverTest {
preferences.edit().putInt("last_sub_id_" + slotId, subId).apply();
}
+ private void setLastBootCount(int slotId, int count) {
+ SharedPreferences preferences =
+ mContext.getSharedPreferences("PREFERENCE_ACTIVATION_INFO", Context.MODE_PRIVATE);
+ preferences.edit().putInt("last_boot_count_" + slotId, count).apply();
+ }
+
private void useDirectExecutor() throws Exception {
Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest");
field.setAccessible(true);
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java b/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java
index 72b9341..cf72f1f 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java
@@ -16,13 +16,19 @@
package com.android.imsserviceentitlement;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION;
+import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
-import android.app.Instrumentation;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
@@ -40,6 +46,8 @@ 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.Executors;
+import com.android.imsserviceentitlement.utils.ImsUtils;
+import com.android.imsserviceentitlement.utils.MetricsLogger;
import org.junit.Before;
import org.junit.Rule;
@@ -52,32 +60,32 @@ import org.mockito.junit.MockitoRule;
import java.lang.reflect.Field;
-// TODO(b/176127289) add tests
@RunWith(AndroidJUnit4.class)
public class WfcActivationControllerTest {
@Rule public final MockitoRule rule = MockitoJUnit.rule();
- @Mock private TelephonyManager mTelephonyManager;
- @Mock private ImsEntitlementApi mActivationApi;
- @Mock private WfcActivationUi mActivationUi;
- @Mock private ConnectivityManager mConnectivityManager;
- @Mock private NetworkInfo mNetworkInfo;
+ @Mock private TelephonyManager mMockTelephonyManager;
+ @Mock private ImsEntitlementApi mMockActivationApi;
+ @Mock private WfcActivationUi mMockActivationUi;
+ @Mock private ConnectivityManager mMockConnectivityManager;
+ @Mock private NetworkInfo mMockNetworkInfo;
+ @Mock private ImsUtils mMockImsUtils;
+ @Mock private MetricsLogger mMockMetricsLogger;
private static final int SUB_ID = 1;
+ private static final int CARRIER_ID = 1234;
private static final String EMERGENCY_ADDRESS_WEB_URL = "webUrl";
private static final String EMERGENCY_ADDRESS_WEB_DATA = "webData";
- private static final String TERMS_AND_CONDITION_WEB_URL = "tncUrl";
- private static final String WEBVIEW_JS_CONTROLLER_NAME = "webviewJsControllerName";
private WfcActivationController mWfcActivationController;
private Context mContext;
- private Instrumentation mInstrumentation;
@Before
public void setUp() throws Exception {
mContext = spy(ApplicationProvider.getApplicationContext());
- when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(
+ mMockTelephonyManager);
setNetworkConnected(true);
Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest");
@@ -87,7 +95,7 @@ public class WfcActivationControllerTest {
@Test
public void startFlow_launchAppForActivation_setPurposeActivation() {
- InOrder mOrderVerifier = inOrder(mActivationUi);
+ InOrder mOrderVerifier = inOrder(mMockActivationUi);
setNetworkConnected(false);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
@@ -102,7 +110,7 @@ public class WfcActivationControllerTest {
@Test
public void startFlow_launchAppForUpdate_setPurposeUpdate() {
- InOrder mOrderVerifier = inOrder(mActivationUi);
+ InOrder mOrderVerifier = inOrder(mMockActivationUi);
setNetworkConnected(false);
buildActivity(ActivityConstants.LAUNCH_APP_UPDATE);
@@ -114,7 +122,7 @@ public class WfcActivationControllerTest {
@Test
public void startFlow_launchAppForShowTc_setPurposeUpdate() {
- InOrder mOrderVerifier = inOrder(mActivationUi);
+ InOrder mOrderVerifier = inOrder(mMockActivationUi);
setNetworkConnected(false);
buildActivity(ActivityConstants.LAUNCH_APP_SHOW_TC);
@@ -129,14 +137,14 @@ public class WfcActivationControllerTest {
@Test
public void finishFlow_isFinishing_showGeneralWaitingUi() {
- InOrder mOrderVerifier = inOrder(mActivationUi);
- when(mActivationApi.checkEntitlementStatus()).thenReturn(null);
+ InOrder mOrderVerifier = inOrder(mMockActivationUi);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(null);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.finishFlow();
mOrderVerifier
- .verify(mActivationUi)
+ .verify(mMockActivationUi)
.showActivationUi(
R.string.activate_title,
R.string.progress_text,
@@ -145,7 +153,7 @@ public class WfcActivationControllerTest {
Activity.RESULT_CANCELED,
0);
mOrderVerifier
- .verify(mActivationUi)
+ .verify(mMockActivationUi)
.showActivationUi(
R.string.activate_title,
R.string.wfc_activation_error,
@@ -156,8 +164,105 @@ public class WfcActivationControllerTest {
}
@Test
+ public void finishFlow_startForUpdate_showGeneralWaitingUi() {
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(
+ EntitlementResult
+ .builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus
+ .builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .setProvStatus(ProvStatus.PROVISIONED)
+ .setTcStatus(TcStatus.AVAILABLE)
+ .setAddrStatus(AddrStatus.AVAILABLE)
+ .build())
+ .build());
+ setNetworkConnected(false);
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID);
+ intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP,
+ ActivityConstants.LAUNCH_APP_UPDATE);
+ mWfcActivationController =
+ new WfcActivationController(
+ mContext,
+ mMockActivationUi,
+ mMockActivationApi,
+ null,
+ mMockImsUtils,
+ mMockMetricsLogger);
+
+ mWfcActivationController.finishFlow();
+
+ verify(mMockActivationUi).setResultAndFinish(eq(Activity.RESULT_OK));
+ }
+
+ @Test
+ public void finish_startFlowForActivate_writeLoggerPurposeActivation() {
+ when(mMockTelephonyManager.getSimCarrierId()).thenReturn(CARRIER_ID);
+ when(mMockTelephonyManager.getSimSpecificCarrierId()).thenReturn(CARRIER_ID);
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID);
+ intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP,
+ ActivityConstants.LAUNCH_APP_ACTIVATE);
+ mWfcActivationController =
+ new WfcActivationController(
+ mContext,
+ mMockActivationUi,
+ mMockActivationApi,
+ intent,
+ mMockImsUtils,
+ mMockMetricsLogger);
+
+ mWfcActivationController.startFlow();
+ mWfcActivationController.finish();
+
+ verify(mMockMetricsLogger).start(eq(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION));
+ verify(mMockMetricsLogger).write(
+ eq(IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI),
+ eq(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED));
+ }
+
+ @Test
+ public void finish_entitlementResultWfcEntitled_writeLoggerAppResultSuccessful() {
+ when(mMockTelephonyManager.getSimCarrierId()).thenReturn(CARRIER_ID);
+ when(mMockTelephonyManager.getSimSpecificCarrierId()).thenReturn(CARRIER_ID);
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID);
+ intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP,
+ ActivityConstants.LAUNCH_APP_ACTIVATE);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(
+ EntitlementResult
+ .builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus
+ .builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .setProvStatus(ProvStatus.PROVISIONED)
+ .setTcStatus(TcStatus.AVAILABLE)
+ .setAddrStatus(AddrStatus.AVAILABLE)
+ .build())
+ .build());
+ mWfcActivationController =
+ new WfcActivationController(
+ mContext,
+ mMockActivationUi,
+ mMockActivationApi,
+ intent,
+ mMockImsUtils,
+ mMockMetricsLogger);
+
+ mWfcActivationController.startFlow();
+ mWfcActivationController.finish();
+
+ verify(mMockMetricsLogger).start(eq(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION));
+ verify(mMockMetricsLogger).write(
+ eq(IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI),
+ eq(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL));
+ }
+
+ @Test
public void handleEntitlementStatusForActivation_isVowifiEntitledTrue_setActivityResultOk() {
- EntitlementResult mEntitlementResult =
+ EntitlementResult entitlementResult =
EntitlementResult.builder()
.setVowifiStatus(
Ts43VowifiStatus.builder()
@@ -167,17 +272,17 @@ public class WfcActivationControllerTest {
.setProvStatus(ProvStatus.PROVISIONED)
.build())
.build();
- when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.evaluateEntitlementStatus();
- verify(mActivationUi).setResultAndFinish(Activity.RESULT_OK);
+ verify(mMockActivationUi).setResultAndFinish(Activity.RESULT_OK);
}
@Test
public void handleEntitlementStatusForActivation_isServerDataMissingTrue_showWebview() {
- EntitlementResult mEntitlementResult =
+ EntitlementResult entitlementResult =
EntitlementResult.builder()
.setVowifiStatus(
Ts43VowifiStatus.builder()
@@ -188,24 +293,45 @@ public class WfcActivationControllerTest {
.setEmergencyAddressWebUrl(EMERGENCY_ADDRESS_WEB_URL)
.setEmergencyAddressWebData(EMERGENCY_ADDRESS_WEB_DATA)
.build();
- when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+ buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
+
+ mWfcActivationController.evaluateEntitlementStatus();
+
+ verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL,
+ EMERGENCY_ADDRESS_WEB_DATA);
+ }
+
+ @Test
+ public void handleEntitlementStatusForActivation_showTc_showWebview() {
+ EntitlementResult entitlementResult =
+ EntitlementResult.builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .setTcStatus(TcStatus.NOT_AVAILABLE)
+ .setAddrStatus(AddrStatus.NOT_AVAILABLE)
+ .build())
+ .setTermsAndConditionsWebUrl(EMERGENCY_ADDRESS_WEB_URL)
+ .build();
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.evaluateEntitlementStatus();
- verify(mActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, EMERGENCY_ADDRESS_WEB_DATA);
+ verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, null);
}
@Test
public void handleEntitlementStatusForActivation_isIncompatibleTrue_showErrorUi() {
- EntitlementResult mEntitlementResult =
+ EntitlementResult entitlementResult =
EntitlementResult.builder()
.setVowifiStatus(
Ts43VowifiStatus.builder()
.setEntitlementStatus(EntitlementStatus.INCOMPATIBLE)
.build())
.build();
- when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.evaluateEntitlementStatus();
@@ -215,7 +341,7 @@ public class WfcActivationControllerTest {
@Test
public void handleEntitlementStatusForActivation_unexpectedStatus_showGeneralErrorUi() {
- EntitlementResult mEntitlementResult =
+ EntitlementResult entitlementResult =
EntitlementResult.builder()
.setVowifiStatus(
Ts43VowifiStatus.builder()
@@ -224,7 +350,7 @@ public class WfcActivationControllerTest {
.setAddrStatus(AddrStatus.IN_PROGRESS)
.build())
.build();
- when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.evaluateEntitlementStatus();
@@ -234,7 +360,7 @@ public class WfcActivationControllerTest {
@Test
public void handleEntitlementStatusAfterActivation_isVowifiEntitledTrue_setActivityResultOk() {
- EntitlementResult mEntitlementResult =
+ EntitlementResult entitlementResult =
EntitlementResult.builder()
.setVowifiStatus(
Ts43VowifiStatus.builder()
@@ -244,17 +370,17 @@ public class WfcActivationControllerTest {
.setProvStatus(ProvStatus.PROVISIONED)
.build())
.build();
- when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.reevaluateEntitlementStatus();
- verify(mActivationUi).setResultAndFinish(Activity.RESULT_OK);
+ verify(mMockActivationUi).setResultAndFinish(Activity.RESULT_OK);
}
@Test
public void handleEntitlementStatusAfterActivation_unexpectedStatus_showGeneralErrorUi() {
- EntitlementResult mEntitlementResult =
+ EntitlementResult entitlementResult =
EntitlementResult.builder()
.setVowifiStatus(
Ts43VowifiStatus.builder()
@@ -263,7 +389,7 @@ public class WfcActivationControllerTest {
.setAddrStatus(AddrStatus.IN_PROGRESS)
.build())
.build();
- when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult);
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE);
mWfcActivationController.reevaluateEntitlementStatus();
@@ -271,24 +397,174 @@ public class WfcActivationControllerTest {
verifyErrorUi(R.string.activate_title, R.string.wfc_activation_error);
}
+ @Test
+ public void handleEntitlementStatusAfterUpdating_entitlementStatusEnabled_setResultOk() {
+ EntitlementResult entitlementResult =
+ EntitlementResult.builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .setTcStatus(TcStatus.AVAILABLE)
+ .setAddrStatus(AddrStatus.AVAILABLE)
+ .setProvStatus(ProvStatus.PROVISIONED)
+ .build())
+ .build();
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+ buildActivity(ActivityConstants.LAUNCH_APP_UPDATE);
+
+ mWfcActivationController.reevaluateEntitlementStatus();
+
+ verify(mMockActivationUi).setResultAndFinish(eq(Activity.RESULT_OK));
+ }
+
+ @Test
+ public void handleEntitlementStatusAfterUpdating_entitlementStatusNoServerData_turnOffWfc() {
+ EntitlementResult entitlementResult =
+ EntitlementResult.builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .setTcStatus(TcStatus.NOT_AVAILABLE)
+ .setAddrStatus(AddrStatus.NOT_AVAILABLE)
+ .build())
+ .build();
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID);
+ intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP,
+ ActivityConstants.LAUNCH_APP_UPDATE);
+ mWfcActivationController =
+ new WfcActivationController(
+ mContext,
+ mMockActivationUi,
+ mMockActivationApi,
+ intent,
+ mMockImsUtils,
+ mMockMetricsLogger);
+
+ mWfcActivationController.reevaluateEntitlementStatus();
+
+ verify(mMockImsUtils).turnOffWfc(any());
+ }
+
+ @Test
+ public void handleEntitlementStatusAfterUpdating_unexpectedStatus_showGeneralErrorUi() {
+ EntitlementResult entitlementResult =
+ EntitlementResult.builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .setTcStatus(TcStatus.IN_PROGRESS)
+ .setAddrStatus(AddrStatus.IN_PROGRESS)
+ .build())
+ .build();
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+ buildActivity(ActivityConstants.LAUNCH_APP_UPDATE);
+
+ mWfcActivationController.reevaluateEntitlementStatus();
+
+ verifyErrorUi(R.string.e911_title, R.string.address_update_error);
+ }
+
+ @Test
+ public void handleEntitlementStatusForUpdate_serviceEntitled_showWebview() {
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(
+ EntitlementResult
+ .builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus
+ .builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .setProvStatus(ProvStatus.PROVISIONED)
+ .setTcStatus(TcStatus.AVAILABLE)
+ .setAddrStatus(AddrStatus.AVAILABLE)
+ .build())
+ .setEmergencyAddressWebUrl(EMERGENCY_ADDRESS_WEB_URL)
+ .setEmergencyAddressWebData(EMERGENCY_ADDRESS_WEB_DATA)
+ .build());
+ buildActivity(ActivityConstants.LAUNCH_APP_UPDATE);
+
+ mWfcActivationController.evaluateEntitlementStatus();
+
+ verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL,
+ EMERGENCY_ADDRESS_WEB_DATA);
+ }
+
+ @Test
+ public void handleEntitlementStatusForUpdate_showTc_showWebview() {
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(
+ EntitlementResult
+ .builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus
+ .builder()
+ .setEntitlementStatus(EntitlementStatus.ENABLED)
+ .setProvStatus(ProvStatus.PROVISIONED)
+ .setTcStatus(TcStatus.AVAILABLE)
+ .setAddrStatus(AddrStatus.AVAILABLE)
+ .build())
+ .setTermsAndConditionsWebUrl(EMERGENCY_ADDRESS_WEB_URL)
+ .build());
+ buildActivity(ActivityConstants.LAUNCH_APP_SHOW_TC);
+
+ mWfcActivationController.evaluateEntitlementStatus();
+
+ verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, null);
+ }
+
+ @Test
+ public void handleEntitlementStatusForUpdate_entitlementStatusIncompatible_showErrorUi() {
+ EntitlementResult entitlementResult =
+ EntitlementResult.builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.INCOMPATIBLE)
+ .build())
+ .build();
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+ buildActivity(ActivityConstants.LAUNCH_APP_UPDATE);
+
+ mWfcActivationController.evaluateEntitlementStatus();
+
+ verifyErrorUi(R.string.e911_title, R.string.failure_contact_carrier);
+ }
+
+ @Test
+ public void handleEntitlementStatusForUpdate_entitlementStatusDisabled_showGenericErrorUi() {
+ EntitlementResult entitlementResult =
+ EntitlementResult.builder()
+ .setVowifiStatus(
+ Ts43VowifiStatus.builder()
+ .setEntitlementStatus(EntitlementStatus.DISABLED)
+ .build())
+ .build();
+ when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult);
+ buildActivity(ActivityConstants.LAUNCH_APP_UPDATE);
+
+ mWfcActivationController.evaluateEntitlementStatus();
+
+ verifyErrorUi(R.string.e911_title, R.string.address_update_error);
+ }
+
private void buildActivity(int extraLaunchCarrierApp) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID);
intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP, extraLaunchCarrierApp);
mWfcActivationController =
- new WfcActivationController(mContext, mActivationUi, mActivationApi, intent);
+ new WfcActivationController(mContext, mMockActivationUi, mMockActivationApi,
+ intent);
}
private void setNetworkConnected(boolean isConnected) {
- when(mNetworkInfo.isConnected()).thenReturn(isConnected);
+ when(mMockNetworkInfo.isConnected()).thenReturn(isConnected);
when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(
- mConnectivityManager);
- when(mConnectivityManager.getActiveNetworkInfo()).thenReturn(mNetworkInfo);
- when(mNetworkInfo.isConnected()).thenReturn(isConnected);
+ mMockConnectivityManager);
+ when(mMockConnectivityManager.getActiveNetworkInfo()).thenReturn(mMockNetworkInfo);
+ when(mMockNetworkInfo.isConnected()).thenReturn(isConnected);
}
private void verifyErrorUi(int title, int errorMesssage) {
- verify(mActivationUi)
+ verify(mMockActivationUi)
.showActivationUi(
title,
errorMesssage,
@@ -298,7 +574,7 @@ public class WfcActivationControllerTest {
}
private void verifyErrorUiInOrder(InOrder inOrder, int title, int errorMesssage) {
- inOrder.verify(mActivationUi)
+ inOrder.verify(mMockActivationUi)
.showActivationUi(
title,
errorMesssage,
@@ -308,7 +584,7 @@ public class WfcActivationControllerTest {
}
private void verifyGeneralWaitingUiInOrder(InOrder inOrder, int title) {
- inOrder.verify(mActivationUi)
+ inOrder.verify(mMockActivationUi)
.showActivationUi(title, R.string.progress_text, true, 0, 0, 0);
}
}
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/entitlement/EntitlementConfigurationTest.java b/tests/unittests/src/com/android/imsserviceentitlement/entitlement/EntitlementConfigurationTest.java
index 4260e5e..eb32c49 100644
--- a/tests/unittests/src/com/android/imsserviceentitlement/entitlement/EntitlementConfigurationTest.java
+++ b/tests/unittests/src/com/android/imsserviceentitlement/entitlement/EntitlementConfigurationTest.java
@@ -68,6 +68,25 @@ public class EntitlementConfigurationTest {
+ " <parm name=\"EntitlementStatus\" value=\"0\"/>\n"
+ " </characteristic>\n"
+ "</wap-provisioningdoc>\n";
+ private static final String RAW_XML_NO_VERS_VERSION =
+ "<wap-provisioningdoc version=\"1.1\">\n"
+ + " <characteristic type=\"VERS\">\n"
+ + " <parm name=\"version\" value=\"\"/>\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=\"ap2004\"/>\n"
+ + " <parm name=\"EntitlementStatus\" value=\"1\"/>\n"
+ + " </characteristic>\n"
+ + " <characteristic type=\"APPLICATION\">\n"
+ + " <parm name=\"AppID\" value=\"ap2003\"/>\n"
+ + " <parm name=\"EntitlementStatus\" value=\"0\"/>\n"
+ + " </characteristic>\n"
+ + "</wap-provisioningdoc>\n";
private static final int SUB_ID = 1;
private Context mContext;
@@ -89,6 +108,7 @@ public class EntitlementConfigurationTest {
assertThat(mConfiguration.getSmsOverIpStatus()).isEqualTo(2);
assertThat(mConfiguration.getToken().get()).isEqualTo("kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX");
assertThat(mConfiguration.getTokenValidity()).isEqualTo(3600);
+ assertThat(mConfiguration.getVersion()).isEqualTo("1");
assertThat(mConfiguration.entitlementValidation()).isEqualTo(
ClientBehavior.VALID_DURING_VALIDITY);
}
@@ -113,4 +133,11 @@ public class EntitlementConfigurationTest {
assertThat(mConfiguration.getToken().get()).isEqualTo("kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX");
assertThat(mConfiguration.getTokenValidity()).isEqualTo(0);
}
+
+ @Test
+ public void updateConfigurations_noVersVersion_getDefaultValue() {
+ mConfiguration.update(RAW_XML_NO_VERS_VERSION);
+
+ assertThat(mConfiguration.getVersion()).isEqualTo("0");
+ }
}
diff --git a/tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java b/tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java
new file mode 100644
index 0000000..961e913
--- /dev/null
+++ b/tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ProvisioningManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class ImsUtilsTest {
+ @Rule public final MockitoRule rule = MockitoJUnit.rule();
+
+ @Mock CarrierConfigManager mMockCarrierConfigManager;
+ @Mock ImsMmTelManager mMockImsMmTelManager;
+ @Mock ProvisioningManager mMockProvisioningManager;
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void isWfcEnabledByUser_invalidSubId_defaultValues() {
+ ImsUtils imsUtils =
+ ImsUtils.getInstance(mContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+
+ assertThat(imsUtils.isWfcEnabledByUser()).isFalse();
+ }
+
+ @Test
+ public void disableAndResetVoWiFiImsSettings_hasCarrierConfig() {
+ PersistableBundle carrierConfig = new PersistableBundle();
+ carrierConfig.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT, 1);
+ carrierConfig.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT, 2);
+ ImsUtils imsUtils =
+ new ImsUtils(carrierConfig, mMockImsMmTelManager, mMockProvisioningManager);
+
+ imsUtils.disableAndResetVoWiFiImsSettings();
+
+ verify(mMockImsMmTelManager).setVoWiFiSettingEnabled(eq(false));
+ verify(mMockImsMmTelManager).setVoWiFiModeSetting(eq(1));
+ verify(mMockImsMmTelManager).setVoWiFiRoamingModeSetting(eq(2));
+ }
+
+ @Test
+ public void disableWfc() {
+ ImsUtils imsUtils = new ImsUtils(
+ new PersistableBundle(), mMockImsMmTelManager, mMockProvisioningManager);
+
+ imsUtils.disableWfc();
+
+ verify(mMockImsMmTelManager).setVoWiFiSettingEnabled(false);
+ }
+}