/* * Copyright (C) 2024 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.server.telecom; import android.content.ComponentName; import android.content.Context; import android.net.Uri; import android.os.Binder; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.sysprop.TelephonyProperties; import android.telecom.Log; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telephony.TelephonyManager; import android.text.TextUtils; import com.android.internal.telecom.ITelecomService; import com.android.modules.utils.BasicShellCommandHandler; import java.util.Arrays; import java.util.stream.Collectors; /** * Implements shell commands sent to telecom using the "adb shell cmd telecom..." command from shell * or CTS. */ public class TelecomShellCommand extends BasicShellCommandHandler { private static final String CALLING_PACKAGE = TelecomShellCommand.class.getPackageName(); private static final String COMMAND_SET_PHONE_ACCOUNT_ENABLED = "set-phone-account-enabled"; private static final String COMMAND_SET_PHONE_ACCOUNT_DISABLED = "set-phone-account-disabled"; private static final String COMMAND_REGISTER_PHONE_ACCOUNT = "register-phone-account"; private static final String COMMAND_SET_USER_SELECTED_OUTGOING_PHONE_ACCOUNT = "set-user-selected-outgoing-phone-account"; private static final String COMMAND_REGISTER_SIM_PHONE_ACCOUNT = "register-sim-phone-account"; private static final String COMMAND_SET_TEST_CALL_REDIRECTION_APP = "set-test-call-redirection-app"; private static final String COMMAND_SET_TEST_CALL_SCREENING_APP = "set-test-call-screening-app"; private static final String COMMAND_ADD_OR_REMOVE_CALL_COMPANION_APP = "add-or-remove-call-companion-app"; private static final String COMMAND_SET_PHONE_ACCOUNT_SUGGESTION_COMPONENT = "set-phone-acct-suggestion-component"; private static final String COMMAND_UNREGISTER_PHONE_ACCOUNT = "unregister-phone-account"; private static final String COMMAND_SET_CALL_DIAGNOSTIC_SERVICE = "set-call-diagnostic-service"; private static final String COMMAND_SET_DEFAULT_DIALER = "set-default-dialer"; private static final String COMMAND_GET_DEFAULT_DIALER = "get-default-dialer"; private static final String COMMAND_STOP_BLOCK_SUPPRESSION = "stop-block-suppression"; private static final String COMMAND_CLEANUP_STUCK_CALLS = "cleanup-stuck-calls"; private static final String COMMAND_CLEANUP_ORPHAN_PHONE_ACCOUNTS = "cleanup-orphan-phone-accounts"; private static final String COMMAND_RESET_CAR_MODE = "reset-car-mode"; private static final String COMMAND_IS_NON_IN_CALL_SERVICE_BOUND = "is-non-ui-in-call-service-bound"; private static final String COMMAND_WAIT_FOR_AUDIO_OPS_COMPLETION = "wait-for-audio-ops-complete"; private static final String COMMAND_WAIT_FOR_AUDIO_ACTIVE_COMPLETION = "wait-for-audio-active"; /** * Change the system dialer package name if a package name was specified, * Example: adb shell telecom set-system-dialer * * Restore it to the default if if argument is "default" or no argument is passed. * Example: adb shell telecom set-system-dialer default */ private static final String COMMAND_SET_SYSTEM_DIALER = "set-system-dialer"; private static final String COMMAND_GET_SYSTEM_DIALER = "get-system-dialer"; private static final String COMMAND_WAIT_ON_HANDLERS = "wait-on-handlers"; private static final String COMMAND_SET_SIM_COUNT = "set-sim-count"; private static final String COMMAND_GET_SIM_CONFIG = "get-sim-config"; private static final String COMMAND_GET_MAX_PHONES = "get-max-phones"; private static final String COMMAND_SET_TEST_EMERGENCY_PHONE_ACCOUNT_PACKAGE_FILTER = "set-test-emergency-phone-account-package-filter"; private static final String COMMAND_SET_METRICS_TEST_ENABLED = "set-metrics-test-enabled"; private static final String COMMAND_SET_METRICS_TEST_DISABLED = "set-metrics-test-disabled"; /** * Command used to emit a distinct "mark" in the logs. */ private static final String COMMAND_LOG_MARK = "log-mark"; private final Context mContext; private final ITelecomService mTelecomService; private TelephonyManager mTelephonyManager; private UserManager mUserManager; public TelecomShellCommand(ITelecomService binder, Context context) { mTelecomService = binder; mContext = context; } @Override public int onCommand(String command) { if (command == null || command.isEmpty()) { onHelp(); return 0; } try { switch (command) { case COMMAND_SET_PHONE_ACCOUNT_ENABLED: runSetPhoneAccountEnabled(true); break; case COMMAND_SET_PHONE_ACCOUNT_DISABLED: runSetPhoneAccountEnabled(false); break; case COMMAND_REGISTER_PHONE_ACCOUNT: runRegisterPhoneAccount(); break; case COMMAND_SET_TEST_CALL_REDIRECTION_APP: runSetTestCallRedirectionApp(); break; case COMMAND_SET_TEST_CALL_SCREENING_APP: runSetTestCallScreeningApp(); break; case COMMAND_ADD_OR_REMOVE_CALL_COMPANION_APP: runAddOrRemoveCallCompanionApp(); break; case COMMAND_SET_PHONE_ACCOUNT_SUGGESTION_COMPONENT: runSetTestPhoneAcctSuggestionComponent(); break; case COMMAND_SET_CALL_DIAGNOSTIC_SERVICE: runSetCallDiagnosticService(); break; case COMMAND_REGISTER_SIM_PHONE_ACCOUNT: runRegisterSimPhoneAccount(); break; case COMMAND_SET_USER_SELECTED_OUTGOING_PHONE_ACCOUNT: runSetUserSelectedOutgoingPhoneAccount(); break; case COMMAND_UNREGISTER_PHONE_ACCOUNT: runUnregisterPhoneAccount(); break; case COMMAND_STOP_BLOCK_SUPPRESSION: runStopBlockSuppression(); break; case COMMAND_CLEANUP_STUCK_CALLS: runCleanupStuckCalls(); break; case COMMAND_CLEANUP_ORPHAN_PHONE_ACCOUNTS: runCleanupOrphanPhoneAccounts(); break; case COMMAND_RESET_CAR_MODE: runResetCarMode(); break; case COMMAND_SET_DEFAULT_DIALER: runSetDefaultDialer(); break; case COMMAND_GET_DEFAULT_DIALER: runGetDefaultDialer(); break; case COMMAND_SET_SYSTEM_DIALER: runSetSystemDialer(); break; case COMMAND_GET_SYSTEM_DIALER: runGetSystemDialer(); break; case COMMAND_WAIT_ON_HANDLERS: runWaitOnHandler(); break; case COMMAND_SET_SIM_COUNT: runSetSimCount(); break; case COMMAND_GET_SIM_CONFIG: runGetSimConfig(); break; case COMMAND_GET_MAX_PHONES: runGetMaxPhones(); break; case COMMAND_IS_NON_IN_CALL_SERVICE_BOUND: runIsNonUiInCallServiceBound(); break; case COMMAND_SET_TEST_EMERGENCY_PHONE_ACCOUNT_PACKAGE_FILTER: runSetEmergencyPhoneAccountPackageFilter(); break; case COMMAND_LOG_MARK: runLogMark(); break; case COMMAND_SET_METRICS_TEST_ENABLED: mTelecomService.setMetricsTestMode(true); break; case COMMAND_SET_METRICS_TEST_DISABLED: mTelecomService.setMetricsTestMode(false); break; case COMMAND_WAIT_FOR_AUDIO_OPS_COMPLETION: mTelecomService.waitForAudioToUpdate(false); break; case COMMAND_WAIT_FOR_AUDIO_ACTIVE_COMPLETION: mTelecomService.waitForAudioToUpdate(true); break; default: return handleDefaultCommands(command); } } catch (Exception e) { getErrPrintWriter().println("Command["+ command + "]: Error: " + e); return -1; } return 0; } @Override public void onHelp() { getOutPrintWriter().println("usage: telecom [subcommand] [options]\n" + "usage: telecom set-phone-account-enabled \n" + "usage: telecom set-phone-account-disabled \n" + "usage: telecom register-phone-account