summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/assisteddialing
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/assisteddialing')
-rw-r--r--java/com/android/dialer/assisteddialing/AssistedDialingMediator.java57
-rw-r--r--java/com/android/dialer/assisteddialing/AssistedDialingMediatorImpl.java70
-rw-r--r--java/com/android/dialer/assisteddialing/AssistedDialingMediatorStub.java34
-rw-r--r--java/com/android/dialer/assisteddialing/ConcreteCreator.java16
-rw-r--r--java/com/android/dialer/assisteddialing/Constraints.java26
-rw-r--r--java/com/android/dialer/assisteddialing/TransformationInfo.java10
6 files changed, 147 insertions, 66 deletions
diff --git a/java/com/android/dialer/assisteddialing/AssistedDialingMediator.java b/java/com/android/dialer/assisteddialing/AssistedDialingMediator.java
index 3d027296c..4dc87a772 100644
--- a/java/com/android/dialer/assisteddialing/AssistedDialingMediator.java
+++ b/java/com/android/dialer/assisteddialing/AssistedDialingMediator.java
@@ -19,63 +19,12 @@ package com.android.dialer.assisteddialing;
import android.annotation.TargetApi;
import android.os.Build.VERSION_CODES;
import android.support.annotation.NonNull;
-import com.android.dialer.common.LogUtil;
import java.util.Optional;
-/**
- * The Mediator for Assisted Dialing.
- *
- * <p>This class is responsible for mediating location discovery of the user, determining if the
- * call is eligible for assisted dialing, and performing the transformation of numbers eligible for
- * assisted dialing.
- */
-public final class AssistedDialingMediator {
-
- private final LocationDetector locationDetector;
- private final NumberTransformer numberTransformer;
-
- protected AssistedDialingMediator(
- @NonNull LocationDetector locationDetector, @NonNull NumberTransformer numberTransformer) {
- if (locationDetector == null) {
- throw new NullPointerException("locationDetector was null");
- }
+/** The core interface for the AssistedDialingMediator. */
+public interface AssistedDialingMediator {
- if (numberTransformer == null) {
- throw new NullPointerException("numberTransformer was null");
- }
- this.locationDetector = locationDetector;
- this.numberTransformer = numberTransformer;
- }
-
- /**
- * Returns a boolean for callers to quickly determine whether or not the AssistedDialingMediator
- * thinks an attempt at assisted dialing is likely to succeed.
- */
- public boolean conditionsEligibleForAssistedDialing(
- @NonNull String numberToCheck,
- @NonNull String userHomeCountryCode,
- @NonNull String userRoamingCountryCode) {
- return numberTransformer.canDoAssistedDialingTransformation(
- numberToCheck, userHomeCountryCode, userRoamingCountryCode);
- }
-
- /**
- * Returns an Optional of type String containing the transformed number that was provided. The
- * transformed number should be capable of dialing out of the User's current country and
- * successfully connecting with a contact in the User's home country.
- */
@SuppressWarnings("AndroidApiChecker") // Use of optional
@TargetApi(VERSION_CODES.N)
- public Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform) {
- Optional<String> userHomeCountryCode = locationDetector.getUpperCaseUserHomeCountry();
- Optional<String> userRoamingCountryCode = locationDetector.getUpperCaseUserRoamingCountry();
-
- if (!userHomeCountryCode.isPresent() || !userRoamingCountryCode.isPresent()) {
- LogUtil.i("AssistedDialingMediator.attemptAssistedDial", "Unable to determine country codes");
- return Optional.empty();
- }
-
- return numberTransformer.doAssistedDialingTransformation(
- numberToTransform, userHomeCountryCode.get(), userRoamingCountryCode.get());
- }
+ public Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform);
}
diff --git a/java/com/android/dialer/assisteddialing/AssistedDialingMediatorImpl.java b/java/com/android/dialer/assisteddialing/AssistedDialingMediatorImpl.java
new file mode 100644
index 000000000..1692614bb
--- /dev/null
+++ b/java/com/android/dialer/assisteddialing/AssistedDialingMediatorImpl.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 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.dialer.assisteddialing;
+
+import android.annotation.TargetApi;
+import android.os.Build.VERSION_CODES;
+import android.support.annotation.NonNull;
+import com.android.dialer.common.LogUtil;
+import java.util.Optional;
+
+/**
+ * The Mediator for Assisted Dialing.
+ *
+ * <p>This class is responsible for mediating location discovery of the user, determining if the
+ * call is eligible for assisted dialing, and performing the transformation of numbers eligible for
+ * assisted dialing.
+ */
+final class AssistedDialingMediatorImpl implements AssistedDialingMediator {
+
+ private final LocationDetector locationDetector;
+ private final NumberTransformer numberTransformer;
+
+ AssistedDialingMediatorImpl(
+ @NonNull LocationDetector locationDetector, @NonNull NumberTransformer numberTransformer) {
+ if (locationDetector == null) {
+ throw new NullPointerException("locationDetector was null");
+ }
+
+ if (numberTransformer == null) {
+ throw new NullPointerException("numberTransformer was null");
+ }
+ this.locationDetector = locationDetector;
+ this.numberTransformer = numberTransformer;
+ }
+
+ /**
+ * Returns an Optional of type String containing the transformed number that was provided. The
+ * transformed number should be capable of dialing out of the User's current country and
+ * successfully connecting with a contact in the User's home country.
+ */
+ @SuppressWarnings("AndroidApiChecker") // Use of optional
+ @TargetApi(VERSION_CODES.N)
+ @Override
+ public Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform) {
+ Optional<String> userHomeCountryCode = locationDetector.getUpperCaseUserHomeCountry();
+ Optional<String> userRoamingCountryCode = locationDetector.getUpperCaseUserRoamingCountry();
+
+ if (!userHomeCountryCode.isPresent() || !userRoamingCountryCode.isPresent()) {
+ LogUtil.i("AssistedDialingMediator.attemptAssistedDial", "Unable to determine country codes");
+ return Optional.empty();
+ }
+
+ return numberTransformer.doAssistedDialingTransformation(
+ numberToTransform, userHomeCountryCode.get(), userRoamingCountryCode.get());
+ }
+}
diff --git a/java/com/android/dialer/assisteddialing/AssistedDialingMediatorStub.java b/java/com/android/dialer/assisteddialing/AssistedDialingMediatorStub.java
new file mode 100644
index 000000000..c7a821214
--- /dev/null
+++ b/java/com/android/dialer/assisteddialing/AssistedDialingMediatorStub.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 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.dialer.assisteddialing;
+
+import android.annotation.TargetApi;
+import android.os.Build.VERSION_CODES;
+import android.support.annotation.NonNull;
+import java.util.Optional;
+
+/** A stub assisted dialing implementation. */
+public final class AssistedDialingMediatorStub implements AssistedDialingMediator {
+
+ /** Always returns an empty Optional. */
+ @Override
+ @SuppressWarnings("AndroidApiChecker") // Use of optional
+ @TargetApi(VERSION_CODES.N)
+ public Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform) {
+ return Optional.empty();
+ }
+}
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index f51216a69..49d3b1f87 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -18,10 +18,12 @@ package com.android.dialer.assisteddialing;
import android.annotation.TargetApi;
import android.content.Context;
+import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.support.annotation.NonNull;
import android.telephony.TelephonyManager;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.configprovider.ConfigProviderBindings;
/**
* A Creator for AssistedDialingMediators.
@@ -32,6 +34,11 @@ import com.android.dialer.common.LogUtil;
@TargetApi(VERSION_CODES.N)
public final class ConcreteCreator {
+ // Floor set at N due to use of Optional.
+ protected static final int BUILD_CODE_FLOOR = Build.VERSION_CODES.N;
+ // Ceiling set at O because this feature will ship as part of the framework in P.
+ protected static final int BUILD_CODE_CEILING = Build.VERSION_CODES.O;
+
/**
* Creates a new AssistedDialingMediator
*
@@ -42,6 +49,7 @@ public final class ConcreteCreator {
*/
public static AssistedDialingMediator createNewAssistedDialingMediator(
@NonNull TelephonyManager telephonyManager, @NonNull Context context) {
+
if (telephonyManager == null) {
LogUtil.i(
"ConcreteCreator.createNewAssistedDialingMediator", "provided TelephonyManager was null");
@@ -51,8 +59,14 @@ public final class ConcreteCreator {
LogUtil.i("ConcreteCreator.createNewAssistedDialingMediator", "provided context was null");
throw new NullPointerException("Provided context was null");
}
+
+ if ((Build.VERSION.SDK_INT < BUILD_CODE_FLOOR || Build.VERSION.SDK_INT > BUILD_CODE_CEILING)
+ || !ConfigProviderBindings.get(context).getBoolean("assisted_dialing_enabled", false)) {
+ return new AssistedDialingMediatorStub();
+ }
+
Constraints constraints = new Constraints(context);
- return new AssistedDialingMediator(
+ return new AssistedDialingMediatorImpl(
new LocationDetector(telephonyManager), new NumberTransformer(constraints));
}
}
diff --git a/java/com/android/dialer/assisteddialing/Constraints.java b/java/com/android/dialer/assisteddialing/Constraints.java
index 6bcab9963..023be1c4c 100644
--- a/java/com/android/dialer/assisteddialing/Constraints.java
+++ b/java/com/android/dialer/assisteddialing/Constraints.java
@@ -62,7 +62,7 @@ final class Constraints {
"GB" /* United Kingdom */,
"JP" /* Japan */,
"MX" /* Mexico */,
- "US" /* United States*/,
+ "US" /* United States */,
};
private final Set<String> supportedCountryCodes =
@@ -115,7 +115,8 @@ final class Constraints {
&& isUserRoaming(userHomeCountryCode, userRoamingCountryCode)
&& isNotInternationalNumber(parsedPhoneNumber)
&& isNotEmergencyNumber(numberToCheck, context)
- && isValidNumber(parsedPhoneNumber);
+ && isValidNumber(parsedPhoneNumber)
+ && doesNotHaveExtension(parsedPhoneNumber);
}
/** Returns a boolean indicating the value equivalence of the provided country codes. */
@@ -165,10 +166,7 @@ final class Constraints {
}
}
- /**
- * Returns a boolean indicating if the provided number and home country code are already
- * internationally formatted.
- */
+ /** Returns a boolean indicating if the provided number is already internationally formatted. */
private boolean isNotInternationalNumber(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
if (parsedPhoneNumber.get().hasCountryCode()
@@ -181,6 +179,22 @@ final class Constraints {
return true;
}
+ /**
+ * Returns a boolean indicating if the provided number has an extension.
+ *
+ * <p>Extensions are currently stripped when formatting a number for mobile dialing, so we don't
+ * want to purposefully truncate a number.
+ */
+ private boolean doesNotHaveExtension(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
+
+ if (parsedPhoneNumber.get().hasExtension()
+ && !TextUtils.isEmpty(parsedPhoneNumber.get().getExtension())) {
+ LogUtil.i("Constraints.doesNotHaveExtension", "phone number has an extension");
+ return false;
+ }
+ return true;
+ }
+
/** Returns a boolean indicating if the provided number is considered to be a valid number. */
private boolean isValidNumber(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
boolean result = PhoneNumberUtil.getInstance().isValidNumber(parsedPhoneNumber.get());
diff --git a/java/com/android/dialer/assisteddialing/TransformationInfo.java b/java/com/android/dialer/assisteddialing/TransformationInfo.java
index 7149d71cc..03e565c51 100644
--- a/java/com/android/dialer/assisteddialing/TransformationInfo.java
+++ b/java/com/android/dialer/assisteddialing/TransformationInfo.java
@@ -43,15 +43,15 @@ public abstract class TransformationInfo {
private static final String TRANSFORMED_NUMBER_COUNTRY_CALLING_CODE_KEY =
"TRANSFORMED_NUMBER_COUNTRY_CALLING_CODE";
- abstract String originalNumber();
+ public abstract String originalNumber();
- abstract String transformedNumber();
+ public abstract String transformedNumber();
- abstract String userHomeCountryCode();
+ public abstract String userHomeCountryCode();
- abstract String userRoamingCountryCode();
+ public abstract String userRoamingCountryCode();
- abstract int transformedNumberCountryCallingCode();
+ public abstract int transformedNumberCountryCallingCode();
public static Builder builder() {
return new AutoValue_TransformationInfo.Builder();