diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2017-11-12 00:55:34 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-11-12 00:55:34 +0000 |
commit | 2b52d2a3cdcb0ac00d87d2c2cbd1d6b750ea036d (patch) | |
tree | c87ae220455edeac1c6fb5b12e033e37a07c9ed4 /java/com/android/dialer/precall/impl | |
parent | 5e20ba7b1c6a9644da034b345000b37856d78125 (diff) | |
parent | b7dba5aaa8c477d97121fc6e3411332e66cbabe8 (diff) |
Merge changes I0ed4fa1b,Ie03ce41e,If41868df,Iba2e9092
* changes:
Expose tab index to protected
Added temporary logging to debug problem with null phone numbers from remote contacts.
Hook up pre-call actions
Implement CallingAccountSelector and AssistedDialAction
Diffstat (limited to 'java/com/android/dialer/precall/impl')
5 files changed, 212 insertions, 4 deletions
diff --git a/java/com/android/dialer/precall/impl/AssistedDialAction.java b/java/com/android/dialer/precall/impl/AssistedDialAction.java new file mode 100644 index 000000000..edf97cce3 --- /dev/null +++ b/java/com/android/dialer/precall/impl/AssistedDialAction.java @@ -0,0 +1,73 @@ +/* + * 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.precall.impl; + +import android.annotation.TargetApi; +import android.os.Build; +import android.os.Bundle; +import android.telecom.PhoneAccount; +import android.telephony.TelephonyManager; +import com.android.dialer.assisteddialing.AssistedDialingMediator; +import com.android.dialer.assisteddialing.ConcreteCreator; +import com.android.dialer.assisteddialing.TransformationInfo; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.common.Assert; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; +import com.android.dialer.precall.PreCallAction; +import com.android.dialer.precall.PreCallCoordinator; +import com.android.dialer.util.CallUtil; +import java.util.Optional; + +/** Rewrites the call URI with country code. TODO(erfanian): use phone account for multi SIM */ +public class AssistedDialAction implements PreCallAction { + + @SuppressWarnings("AndroidApiChecker") // Use of optional + @TargetApi(Build.VERSION_CODES.N) + @Override + public void run(PreCallCoordinator coordinator) { + CallIntentBuilder builder = coordinator.getBuilder(); + if (!builder.isAssistedDialAllowed()) { + return; + } + AssistedDialingMediator assistedDialingMediator = + ConcreteCreator.createNewAssistedDialingMediator( + coordinator.getActivity().getSystemService(TelephonyManager.class), + coordinator.getActivity()); + if (!assistedDialingMediator.isPlatformEligible()) { + return; + } + builder.getOutgoingCallExtras().putBoolean(TelephonyManagerCompat.ALLOW_ASSISTED_DIAL, true); + String phoneNumber = + builder.getUri().getScheme().equals(PhoneAccount.SCHEME_TEL) + ? builder.getUri().getSchemeSpecificPart() + : ""; + Optional<TransformationInfo> transformedNumber = + assistedDialingMediator.attemptAssistedDial(phoneNumber); + if (transformedNumber.isPresent()) { + Bundle assistedDialingExtras = transformedNumber.get().toBundle(); + builder.getOutgoingCallExtras().putBoolean(TelephonyManagerCompat.IS_ASSISTED_DIALED, true); + builder + .getOutgoingCallExtras() + .putBundle(TelephonyManagerCompat.ASSISTED_DIALING_EXTRAS, assistedDialingExtras); + builder.setUri( + CallUtil.getCallUri(Assert.isNotNull(transformedNumber.get().transformedNumber()))); + } + } + + @Override + public void onDiscard() {} +} diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java new file mode 100644 index 000000000..ca8798c5d --- /dev/null +++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java @@ -0,0 +1,114 @@ +/* + * 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.precall.impl; + +import android.app.Activity; +import android.support.annotation.MainThread; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment; +import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.common.Assert; +import com.android.dialer.precall.PreCallAction; +import com.android.dialer.precall.PreCallCoordinator; +import java.util.List; + +/** PreCallAction to select which phone account to call with. Ignored if there's only one account */ +@SuppressWarnings("MissingPermission") +public class CallingAccountSelector implements PreCallAction { + + @VisibleForTesting static final String TAG_CALLING_ACCOUNT_SELECTOR = "CallingAccountSelector"; + + private SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment; + + private boolean isDiscarding; + + @Override + public void run(PreCallCoordinator coordinator) { + CallIntentBuilder builder = coordinator.getBuilder(); + if (builder.getPhoneAccountHandle() != null) { + return; + } + Activity activity = coordinator.getActivity(); + TelecomManager telecomManager = activity.getSystemService(TelecomManager.class); + List<PhoneAccountHandle> accounts = telecomManager.getCallCapablePhoneAccounts(); + if (accounts.size() <= 1) { + return; + } + boolean isVoicemail = builder.getUri().getScheme().equals(PhoneAccount.SCHEME_VOICEMAIL); + + if (!isVoicemail) { + PhoneAccountHandle defaultPhoneAccount = + telecomManager.getDefaultOutgoingPhoneAccount(builder.getUri().getScheme()); + if (defaultPhoneAccount != null) { + builder.setPhoneAccountHandle(defaultPhoneAccount); + return; + } + } + + selectPhoneAccountDialogFragment = + SelectPhoneAccountDialogFragment.newInstance( + R.string.pre_call_select_phone_account, + false /* canSetDefault */, // TODO(twyen): per contact defaults + accounts, + new SelectedListener(coordinator, coordinator.startPendingAction()), + null /* call ID */); + selectPhoneAccountDialogFragment.show( + activity.getFragmentManager(), TAG_CALLING_ACCOUNT_SELECTOR); + } + + @Override + public void onDiscard() { + isDiscarding = true; + selectPhoneAccountDialogFragment.dismiss(); + } + + private class SelectedListener extends SelectPhoneAccountListener { + + private final PreCallCoordinator coordinator; + private final PreCallCoordinator.PendingAction listener; + + public SelectedListener( + @NonNull PreCallCoordinator builder, @NonNull PreCallCoordinator.PendingAction listener) { + this.coordinator = Assert.isNotNull(builder); + this.listener = Assert.isNotNull(listener); + } + + @MainThread + @Override + public void onPhoneAccountSelected( + PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) { + coordinator.getBuilder().setPhoneAccountHandle(selectedAccountHandle); + listener.finish(); + } + + @MainThread + @Override + public void onDialogDismissed(@Nullable String callId) { + if (isDiscarding) { + return; + } + coordinator.abortCall(); + listener.finish(); + } + } +} diff --git a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java index 25083ef0b..6302a2395 100644 --- a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java +++ b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java @@ -38,8 +38,6 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator { private static final String SAVED_STATE_CURRENT_ACTION = "current_action"; - static final String EXTRA_CALL_INTENT_BUILDER = "extra_call_intent_builder"; - @NonNull private final Activity activity; private CallIntentBuilder builder; diff --git a/java/com/android/dialer/precall/impl/PreCallImpl.java b/java/com/android/dialer/precall/impl/PreCallImpl.java index ac9750ef2..21c5dc9e2 100644 --- a/java/com/android/dialer/precall/impl/PreCallImpl.java +++ b/java/com/android/dialer/precall/impl/PreCallImpl.java @@ -22,6 +22,7 @@ import android.support.annotation.NonNull; import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.precall.PreCall; import com.android.dialer.precall.PreCallAction; +import com.android.dialer.precall.PreCallCoordinator; import com.google.common.collect.ImmutableList; import javax.inject.Inject; @@ -33,14 +34,14 @@ public class PreCallImpl implements PreCall { @Override public ImmutableList<PreCallAction> getActions() { - return ImmutableList.of(); + return ImmutableList.of(new CallingAccountSelector(), new AssistedDialAction()); } @NonNull @Override public Intent buildIntent(Context context, CallIntentBuilder builder) { Intent intent = new Intent(context, PreCallActivity.class); - intent.putExtra(PreCallCoordinatorImpl.EXTRA_CALL_INTENT_BUILDER, builder); + intent.putExtra(PreCallCoordinator.EXTRA_CALL_INTENT_BUILDER, builder); return intent; } } diff --git a/java/com/android/dialer/precall/impl/res/values/strings.xml b/java/com/android/dialer/precall/impl/res/values/strings.xml new file mode 100644 index 000000000..894394662 --- /dev/null +++ b/java/com/android/dialer/precall/impl/res/values/strings.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> +<resources> + <!-- Title of the dialog to select which SIM to call with before making a call, if the device has + multiple SIMs [CHAR LIMIT=40]--> + <string name="pre_call_select_phone_account">Call with</string> + +</resources>
\ No newline at end of file |