/* * 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 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(); } } }