diff options
56 files changed, 944 insertions, 382 deletions
diff --git a/Android.bp b/Android.bp index 7d95b9a1b1fb..561166e128ae 100644 --- a/Android.bp +++ b/Android.bp @@ -442,6 +442,7 @@ java_library { ], // For backwards compatibility. stem: "framework", + apex_available: ["//apex_available:platform"], } // This "framework" module is NOT installed to the device. It's @@ -463,6 +464,7 @@ java_library { // TODO(jiyong): add more stubs for APEXes here ], sdk_version: "core_platform", + apex_available: ["//apex_available:platform"], } java_library { @@ -470,6 +472,7 @@ java_library { defaults: ["framework-defaults"], srcs: [":framework-all-sources"], installable: false, + apex_available: ["//apex_available:platform"], } java_library { @@ -1629,6 +1632,8 @@ filegroup { "core/java/android/util/LocalLog.java", "core/java/android/util/TimeUtils.java", "core/java/com/android/internal/os/SomeArgs.java", + "core/java/com/android/internal/util/AsyncChannel.java", + "core/java/com/android/internal/util/BitwiseInputStream.java", "core/java/com/android/internal/util/FastXmlSerializer.java", "core/java/com/android/internal/util/HexDump.java", "core/java/com/android/internal/util/IState.java", diff --git a/apex/sdkext/framework/java/android/os/ext/SdkExtensions.java b/apex/sdkext/framework/java/android/os/ext/SdkExtensions.java index d3b9397d45f2..a8a7effa9b6c 100644 --- a/apex/sdkext/framework/java/android/os/ext/SdkExtensions.java +++ b/apex/sdkext/framework/java/android/os/ext/SdkExtensions.java @@ -60,7 +60,7 @@ public class SdkExtensions { */ public static int getExtensionVersion(@SdkVersion int sdk) { if (sdk < VERSION_CODES.R) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException(String.valueOf(sdk) + " does not have extensions"); } return R_EXTENSION_INT; } diff --git a/api/current.txt b/api/current.txt index 5fbd96711b51..5d1564656274 100644 --- a/api/current.txt +++ b/api/current.txt @@ -43420,6 +43420,7 @@ package android.telecom { field public static final String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; field public static final String EVENT_CALL_REMOTELY_HELD = "android.telecom.event.CALL_REMOTELY_HELD"; field public static final String EVENT_CALL_REMOTELY_UNHELD = "android.telecom.event.CALL_REMOTELY_UNHELD"; + field public static final String EVENT_CALL_SWITCH_FAILED = "android.telecom.event.CALL_SWITCH_FAILED"; field public static final String EVENT_MERGE_COMPLETE = "android.telecom.event.MERGE_COMPLETE"; field public static final String EVENT_MERGE_START = "android.telecom.event.MERGE_START"; field public static final String EVENT_ON_HOLD_TONE_END = "android.telecom.event.ON_HOLD_TONE_END"; @@ -43877,19 +43878,27 @@ package android.telecom { field @Deprecated public static final String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL"; field public static final String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED"; field public static final String ACTION_PHONE_ACCOUNT_UNREGISTERED = "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED"; + field public static final String ACTION_POST_CALL = "android.telecom.action.POST_CALL"; field public static final String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS"; field public static final String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS"; field public static final String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION"; field public static final String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS"; field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ',' field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';' + field public static final int DURATION_LONG = 3; // 0x3 + field public static final int DURATION_MEDIUM = 2; // 0x2 + field public static final int DURATION_SHORT = 1; // 0x1 + field public static final int DURATION_VERY_SHORT = 0; // 0x0 field public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; field public static final String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE"; field public static final String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE"; + field public static final String EXTRA_CALL_DURATION = "android.telecom.extra.CALL_DURATION"; field public static final String EXTRA_CALL_NETWORK_TYPE = "android.telecom.extra.CALL_NETWORK_TYPE"; field public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME"; field public static final String EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME = "android.telecom.extra.DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME"; + field public static final String EXTRA_DISCONNECT_CAUSE = "android.telecom.extra.DISCONNECT_CAUSE"; + field public static final String EXTRA_HANDLE = "android.telecom.extra.HANDLE"; field public static final String EXTRA_INCOMING_CALL_ADDRESS = "android.telecom.extra.INCOMING_CALL_ADDRESS"; field public static final String EXTRA_INCOMING_CALL_EXTRAS = "android.telecom.extra.INCOMING_CALL_EXTRAS"; field public static final String EXTRA_INCOMING_VIDEO_STATE = "android.telecom.extra.INCOMING_VIDEO_STATE"; @@ -44129,6 +44138,7 @@ package android.telephony { method public void notifyConfigChangedForSubId(int); field public static final String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED"; field public static final int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe + field public static final int DATA_CYCLE_USE_PLATFORM_DEFAULT = -1; // 0xffffffff field public static final String EXTRA_SLOT_INDEX = "android.telephony.extra.SLOT_INDEX"; field public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX"; field public static final String KEY_5G_NR_SSRSRP_THRESHOLDS_INT_ARRAY = "5g_nr_ssrsrp_thresholds_int_array"; @@ -44139,6 +44149,7 @@ package android.telephony { field public static final String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call"; field public static final String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool"; field public static final String KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL = "allow_emergency_video_calls_bool"; + field public static final String KEY_ALLOW_HOLDING_VIDEO_CALL_BOOL = "allow_holding_video_call"; field public static final String KEY_ALLOW_HOLD_CALL_DURING_EMERGENCY_BOOL = "allow_hold_call_during_emergency_bool"; field public static final String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool"; field public static final String KEY_ALLOW_MERGE_WIFI_CALLS_WHEN_VOWIFI_OFF_BOOL = "allow_merge_wifi_calls_when_vowifi_off_bool"; @@ -44188,11 +44199,16 @@ package android.telephony { field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string"; field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string"; field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string"; - field public static final String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string"; + field public static final String KEY_CONFIG_IMS_MMTEL_PACKAGE_OVERRIDE_STRING = "config_ims_mmtel_package_override_string"; + field @Deprecated public static final String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string"; + field public static final String KEY_CONFIG_IMS_RCS_PACKAGE_OVERRIDE_STRING = "config_ims_rcs_package_override_string"; field public static final String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string"; field public static final String KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL = "config_telephony_use_own_number_for_voicemail_bool"; field public static final String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; + field public static final String KEY_DATA_LIMIT_NOTIFICATION_BOOL = "data_limit_notification_bool"; field public static final String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long"; + field public static final String KEY_DATA_RAPID_NOTIFICATION_BOOL = "data_rapid_notification_bool"; + field public static final String KEY_DATA_WARNING_NOTIFICATION_BOOL = "data_warning_notification_bool"; field public static final String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long"; field public static final String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string"; field public static final String KEY_DEFAULT_VM_NUMBER_ROAMING_AND_IMS_UNREGISTERED_STRING = "default_vm_number_roaming_and_ims_unregistered_string"; @@ -45143,6 +45159,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean doesSwitchMultiSimConfigTriggerReboot(); method public int getActiveModemCount(); method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public java.util.List<android.telephony.CellInfo> getAllCellInfo(); + method @NonNull public static int[] getAllNetworkTypes(); method public int getCallState(); method public int getCardIdForDefaultEuicc(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @WorkerThread public android.os.PersistableBundle getCarrierConfig(); @@ -45328,6 +45345,8 @@ package android.telephony { field public static final int PHONE_TYPE_NONE = 0; // 0x0 field public static final int PHONE_TYPE_SIP = 3; // 0x3 field public static final int SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION = 2; // 0x2 + field public static final int SET_OPPORTUNISTIC_SUB_NO_OPPORTUNISTIC_SUB_AVAILABLE = 3; // 0x3 + field public static final int SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION = 4; // 0x4 field public static final int SET_OPPORTUNISTIC_SUB_SUCCESS = 0; // 0x0 field public static final int SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED = 1; // 0x1 field public static final int SIM_STATE_ABSENT = 1; // 0x1 @@ -45344,8 +45363,14 @@ package android.telephony { field public static final int UNKNOWN_CARRIER_ID = -1; // 0xffffffff field public static final int UNSUPPORTED_CARD_ID = -1; // 0xffffffff field public static final int UPDATE_AVAILABLE_NETWORKS_ABORTED = 2; // 0x2 + field public static final int UPDATE_AVAILABLE_NETWORKS_DISABLE_MODEM_FAIL = 5; // 0x5 + field public static final int UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL = 6; // 0x6 field public static final int UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS = 3; // 0x3 + field public static final int UPDATE_AVAILABLE_NETWORKS_MULTIPLE_NETWORKS_NOT_SUPPORTED = 7; // 0x7 field public static final int UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE = 4; // 0x4 + field public static final int UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE = 8; // 0x8 + field public static final int UPDATE_AVAILABLE_NETWORKS_REMOTE_SERVICE_EXCEPTION = 9; // 0x9 + field public static final int UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED = 10; // 0xa field public static final int UPDATE_AVAILABLE_NETWORKS_SUCCESS = 0; // 0x0 field public static final int UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE = 1; // 0x1 field public static final int USSD_ERROR_SERVICE_UNAVAIL = -2; // 0xfffffffe diff --git a/api/system-current.txt b/api/system-current.txt index 21542debbf50..62c2d796186f 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4319,12 +4319,20 @@ package android.net { ctor public LinkProperties(@Nullable android.net.LinkProperties); method public boolean addDnsServer(@NonNull java.net.InetAddress); method public boolean addLinkAddress(@NonNull android.net.LinkAddress); + method public boolean addPcscfServer(@NonNull java.net.InetAddress); + method @NonNull public java.util.List<java.net.InetAddress> getAddresses(); + method @NonNull public java.util.List<java.lang.String> getAllInterfaceNames(); + method @NonNull public java.util.List<android.net.LinkAddress> getAllLinkAddresses(); + method @NonNull public java.util.List<android.net.RouteInfo> getAllRoutes(); method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers(); method @Nullable public String getTcpBufferSizes(); method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); method public boolean hasGlobalIpv6Address(); method public boolean hasIpv4Address(); + method public boolean hasIpv4DefaultRoute(); + method public boolean hasIpv4DnsServer(); method public boolean hasIpv6DefaultRoute(); + method public boolean hasIpv6DnsServer(); method public boolean isIpv4Provisioned(); method public boolean isIpv6Provisioned(); method public boolean isProvisioned(); @@ -7937,6 +7945,13 @@ package android.telephony { public class CbGeoUtils { } + public static class CbGeoUtils.Circle implements android.telephony.CbGeoUtils.Geometry { + ctor public CbGeoUtils.Circle(@NonNull android.telephony.CbGeoUtils.LatLng, double); + method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng); + method @NonNull public android.telephony.CbGeoUtils.LatLng getCenter(); + method public double getRadius(); + } + public static interface CbGeoUtils.Geometry { method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng); } @@ -7949,6 +7964,12 @@ package android.telephony { field public final double lng; } + public static class CbGeoUtils.Polygon implements android.telephony.CbGeoUtils.Geometry { + ctor public CbGeoUtils.Polygon(@NonNull java.util.List<android.telephony.CbGeoUtils.LatLng>); + method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng); + method @NonNull public java.util.List<android.telephony.CbGeoUtils.LatLng> getVertices(); + } + public class CellBroadcastIntents { method public static void sendOrderedBroadcastForBackgroundReceivers(@NonNull android.content.Context, @Nullable android.os.UserHandle, @NonNull android.content.Intent, @Nullable String, @Nullable String, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle); } @@ -8808,11 +8829,13 @@ package android.telephony { public final class SmsManager { method public boolean disableCellBroadcastRange(int, int, int); method public boolean enableCellBroadcastRange(int, int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSmsCapacityOnIcc(); method public void sendMultipartTextMessage(@NonNull String, @NonNull String, @NonNull java.util.List<java.lang.String>, @Nullable java.util.List<android.app.PendingIntent>, @Nullable java.util.List<android.app.PendingIntent>, @NonNull String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>); } public class SubscriptionInfo implements android.os.Parcelable { + method public boolean areUiccApplicationsEnabled(); method @Nullable public java.util.List<android.telephony.UiccAccessRule> getAccessRules(); method public int getProfileClass(); method public boolean isGroupDisabled(); @@ -8924,6 +8947,7 @@ package android.telephony { method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int, @Nullable String, int); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelBySlot(int, int, int, int, int, int, @Nullable String); method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAnyRadioPoweredOn(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApplicationOnUicc(int); method public boolean isDataConnectivityPossible(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(int); @@ -8965,6 +8989,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int); method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoiceActivationState(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void shutdownAllRadios(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPin(String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPuk(String, String); @@ -8975,6 +9000,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateTestOtaEmergencyNumberDbFilePath(@NonNull String); field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED"; field public static final String ACTION_EMERGENCY_ASSISTANCE = "android.telephony.action.EMERGENCY_ASSISTANCE"; + field public static final String ACTION_NETWORK_SET_TIME = "android.telephony.action.NETWORK_SET_TIME"; field public static final String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED"; field public static final String ACTION_SIM_CARD_STATE_CHANGED = "android.telephony.action.SIM_CARD_STATE_CHANGED"; field public static final String ACTION_SIM_SLOT_STATUS_CHANGED = "android.telephony.action.SIM_SLOT_STATUS_CHANGED"; diff --git a/cmds/incident/main.cpp b/cmds/incident/main.cpp index 6c3d19715c2e..eb2b98a666b9 100644 --- a/cmds/incident/main.cpp +++ b/cmds/incident/main.cpp @@ -375,7 +375,7 @@ main(int argc, char** argv) if (destination == DEST_STDOUT) { // Call into the service sp<StatusListener> listener(new StatusListener()); - status = service->reportIncidentToStream(args, listener, writeEnd); + status = service->reportIncidentToStream(args, listener, std::move(writeEnd)); if (!status.isOk()) { fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string()); @@ -388,7 +388,7 @@ main(int argc, char** argv) } else if (destination == DEST_DUMPSTATE) { // Call into the service sp<StatusListener> listener(new StatusListener()); - status = service->reportIncidentToDumpstate(writeEnd, listener); + status = service->reportIncidentToDumpstate(std::move(writeEnd), listener); if (!status.isOk()) { fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string()); return 1; diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp index 999936bda1d3..cfd77c2357cd 100644 --- a/cmds/incidentd/src/IncidentService.cpp +++ b/cmds/incidentd/src/IncidentService.cpp @@ -279,7 +279,7 @@ Status IncidentService::reportIncident(const IncidentReportArgs& args) { Status IncidentService::reportIncidentToStream(const IncidentReportArgs& args, const sp<IIncidentReportStatusListener>& listener, - const unique_fd& stream) { + unique_fd stream) { IncidentReportArgs argsCopy(args); // Streaming reports can not also be broadcast. @@ -306,7 +306,7 @@ Status IncidentService::reportIncidentToStream(const IncidentReportArgs& args, return Status::ok(); } -Status IncidentService::reportIncidentToDumpstate(const unique_fd& stream, +Status IncidentService::reportIncidentToDumpstate(unique_fd stream, const sp<IIncidentReportStatusListener>& listener) { uid_t caller = IPCThreadState::self()->getCallingUid(); if (caller != AID_ROOT && caller != AID_SHELL) { diff --git a/cmds/incidentd/src/IncidentService.h b/cmds/incidentd/src/IncidentService.h index fb013d0bf92d..b2c7f233e11b 100644 --- a/cmds/incidentd/src/IncidentService.h +++ b/cmds/incidentd/src/IncidentService.h @@ -121,9 +121,9 @@ public: virtual Status reportIncidentToStream(const IncidentReportArgs& args, const sp<IIncidentReportStatusListener>& listener, - const unique_fd& stream); + unique_fd stream); - virtual Status reportIncidentToDumpstate(const unique_fd& stream, + virtual Status reportIncidentToDumpstate(unique_fd stream, const sp<IIncidentReportStatusListener>& listener); virtual Status systemRunning(); diff --git a/cmds/svc/src/com/android/commands/svc/DataCommand.java b/cmds/svc/src/com/android/commands/svc/DataCommand.java index b4dbd1d41bc1..35510cfd38b1 100644 --- a/cmds/svc/src/com/android/commands/svc/DataCommand.java +++ b/cmds/svc/src/com/android/commands/svc/DataCommand.java @@ -16,16 +16,12 @@ package com.android.commands.svc; -/** - * @deprecated Please use adb shell cmd phone data enabled/disable instead. - */ -@Deprecated -public class DataCommand extends Svc.Command { - - private static final String DECPRECATED_MESSAGE = - "adb shell svc data enable/disable is deprecated;" - + "please use adb shell cmd phone data enable/disable instead."; +import android.os.ServiceManager; +import android.os.RemoteException; +import android.content.Context; +import com.android.internal.telephony.ITelephony; +public class DataCommand extends Svc.Command { public DataCommand() { super("data"); } @@ -37,10 +33,36 @@ public class DataCommand extends Svc.Command { public String longHelp() { return shortHelp() + "\n" + "\n" - + DECPRECATED_MESSAGE; + + "usage: svc data [enable|disable]\n" + + " Turn mobile data on or off.\n\n"; } public void run(String[] args) { - System.err.println(DECPRECATED_MESSAGE); + boolean validCommand = false; + if (args.length >= 2) { + boolean flag = false; + if ("enable".equals(args[1])) { + flag = true; + validCommand = true; + } else if ("disable".equals(args[1])) { + flag = false; + validCommand = true; + } + if (validCommand) { + ITelephony phoneMgr + = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); + try { + if (flag) { + phoneMgr.enableDataConnectivity(); + } else + phoneMgr.disableDataConnectivity(); + } + catch (RemoteException e) { + System.err.println("Mobile data operation failed: " + e); + } + return; + } + } + System.err.println(longHelp()); } } diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 8e1834113486..ed509cb3da34 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -74,6 +74,8 @@ public final class LinkProperties implements Parcelable { private static final int MIN_MTU_V6 = 1280; private static final int MAX_MTU = 10000; + private static final int INET6_ADDR_LENGTH = 16; + // Stores the properties of links that are "stacked" above this link. // Indexed by interface name to allow modification and to prevent duplicates being added. private Hashtable<String, LinkProperties> mStackedLinks = new Hashtable<>(); @@ -227,7 +229,7 @@ public final class LinkProperties implements Parcelable { /** * @hide */ - @UnsupportedAppUsage + @SystemApi public @NonNull List<String> getAllInterfaceNames() { List<String> interfaceNames = new ArrayList<>(mStackedLinks.size() + 1); if (mIfaceName != null) interfaceNames.add(mIfaceName); @@ -247,7 +249,7 @@ public final class LinkProperties implements Parcelable { * @return An unmodifiable {@link List} of {@link InetAddress} for this link. * @hide */ - @UnsupportedAppUsage + @SystemApi public @NonNull List<InetAddress> getAddresses() { final List<InetAddress> addresses = new ArrayList<>(); for (LinkAddress linkAddress : mLinkAddresses) { @@ -342,8 +344,8 @@ public final class LinkProperties implements Parcelable { * Returns all the addresses on this link and all the links stacked above it. * @hide */ - @UnsupportedAppUsage - public List<LinkAddress> getAllLinkAddresses() { + @SystemApi + public @NonNull List<LinkAddress> getAllLinkAddresses() { List<LinkAddress> addresses = new ArrayList<>(mLinkAddresses); for (LinkProperties stacked: mStackedLinks.values()) { addresses.addAll(stacked.getAllLinkAddresses()); @@ -542,6 +544,7 @@ public final class LinkProperties implements Parcelable { * @return true if the PCSCF server was added, false otherwise. * @hide */ + @SystemApi public boolean addPcscfServer(@NonNull InetAddress pcscfServer) { if (pcscfServer != null && !mPcscfs.contains(pcscfServer)) { mPcscfs.add(pcscfServer); @@ -729,7 +732,7 @@ public final class LinkProperties implements Parcelable { * Returns all the routes on this link and all the links stacked above it. * @hide */ - @UnsupportedAppUsage + @SystemApi public @NonNull List<RouteInfo> getAllRoutes() { List<RouteInfo> routes = new ArrayList<>(mRoutes); for (LinkProperties stacked: mStackedLinks.values()) { @@ -1025,7 +1028,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv4 default route, {@code false} otherwise. * @hide */ - @UnsupportedAppUsage + @SystemApi public boolean hasIpv4DefaultRoute() { for (RouteInfo r : mRoutes) { if (r.isIPv4Default()) { @@ -1082,7 +1085,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv4 DNS server, {@code false} otherwise. * @hide */ - @UnsupportedAppUsage + @SystemApi public boolean hasIpv4DnsServer() { for (InetAddress ia : mDnses) { if (ia instanceof Inet4Address) { @@ -1110,7 +1113,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv6 DNS server, {@code false} otherwise. * @hide */ - @UnsupportedAppUsage + @SystemApi public boolean hasIpv6DnsServer() { for (InetAddress ia : mDnses) { if (ia instanceof Inet6Address) { @@ -1626,20 +1629,11 @@ public final class LinkProperties implements Parcelable { dest.writeParcelable(linkAddress, flags); } - dest.writeInt(mDnses.size()); - for (InetAddress d : mDnses) { - dest.writeByteArray(d.getAddress()); - } - dest.writeInt(mValidatedPrivateDnses.size()); - for (InetAddress d : mValidatedPrivateDnses) { - dest.writeByteArray(d.getAddress()); - } + writeAddresses(dest, mDnses); + writeAddresses(dest, mValidatedPrivateDnses); dest.writeBoolean(mUsePrivateDns); dest.writeString(mPrivateDnsServerName); - dest.writeInt(mPcscfs.size()); - for (InetAddress d : mPcscfs) { - dest.writeByteArray(d.getAddress()); - } + writeAddresses(dest, mPcscfs); dest.writeString(mDomains); dest.writeInt(mMtu); dest.writeString(mTcpBufferSizes); @@ -1662,6 +1656,35 @@ public final class LinkProperties implements Parcelable { dest.writeBoolean(mWakeOnLanSupported); } + private static void writeAddresses(@NonNull Parcel dest, @NonNull List<InetAddress> list) { + dest.writeInt(list.size()); + for (InetAddress d : list) { + writeAddress(dest, d); + } + } + + private static void writeAddress(@NonNull Parcel dest, @NonNull InetAddress addr) { + dest.writeByteArray(addr.getAddress()); + if (addr instanceof Inet6Address) { + final Inet6Address v6Addr = (Inet6Address) addr; + final boolean hasScopeId = v6Addr.getScopeId() != 0; + dest.writeBoolean(hasScopeId); + if (hasScopeId) dest.writeInt(v6Addr.getScopeId()); + } + } + + @NonNull + private static InetAddress readAddress(@NonNull Parcel p) throws UnknownHostException { + final byte[] addr = p.createByteArray(); + if (addr.length == INET6_ADDR_LENGTH) { + final boolean hasScopeId = p.readBoolean(); + final int scopeId = hasScopeId ? p.readInt() : 0; + return Inet6Address.getByAddress(null /* host */, addr, scopeId); + } + + return InetAddress.getByAddress(addr); + } + /** * Implement the Parcelable interface. */ @@ -1681,14 +1704,13 @@ public final class LinkProperties implements Parcelable { addressCount = in.readInt(); for (int i = 0; i < addressCount; i++) { try { - netProp.addDnsServer(InetAddress.getByAddress(in.createByteArray())); + netProp.addDnsServer(readAddress(in)); } catch (UnknownHostException e) { } } addressCount = in.readInt(); for (int i = 0; i < addressCount; i++) { try { - netProp.addValidatedPrivateDnsServer( - InetAddress.getByAddress(in.createByteArray())); + netProp.addValidatedPrivateDnsServer(readAddress(in)); } catch (UnknownHostException e) { } } netProp.setUsePrivateDns(in.readBoolean()); @@ -1696,7 +1718,7 @@ public final class LinkProperties implements Parcelable { addressCount = in.readInt(); for (int i = 0; i < addressCount; i++) { try { - netProp.addPcscfServer(InetAddress.getByAddress(in.createByteArray())); + netProp.addPcscfServer(readAddress(in)); } catch (UnknownHostException e) { } } netProp.setDomains(in.readString()); diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index d016ec4d7c7b..6efe1de4ac45 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -2421,7 +2421,7 @@ public abstract class BatteryStats implements Parcelable { public static final int DATA_CONNECTION_OUT_OF_SERVICE = 0; public static final int DATA_CONNECTION_EMERGENCY_SERVICE = - TelephonyManager.MAX_NETWORK_TYPE + 1; + TelephonyManager.getAllNetworkTypes().length + 1; public static final int DATA_CONNECTION_OTHER = DATA_CONNECTION_EMERGENCY_SERVICE + 1; diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 4ed7b17d1549..bf26a41c536a 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -1874,8 +1874,14 @@ public final class Debug public static final int MEMINFO_PAGE_TABLES = 13; /** @hide */ public static final int MEMINFO_KERNEL_STACK = 14; + /** + * Note: MEMINFO_KRECLAIMABLE includes MEMINFO_SLAB_RECLAIMABLE (see KReclaimable field + * description in kernel documentation). + * @hide + */ + public static final int MEMINFO_KRECLAIMABLE = 15; /** @hide */ - public static final int MEMINFO_COUNT = 15; + public static final int MEMINFO_COUNT = 16; /** * Retrieves /proc/meminfo. outSizes is filled with fields diff --git a/core/java/android/os/IVibratorService.aidl b/core/java/android/os/IVibratorService.aidl index 1456ff7e6c5e..6b881fecad56 100644 --- a/core/java/android/os/IVibratorService.aidl +++ b/core/java/android/os/IVibratorService.aidl @@ -24,6 +24,7 @@ interface IVibratorService { boolean hasVibrator(); boolean hasAmplitudeControl(); + boolean setAlwaysOnEffect(int id, in VibrationEffect effect, in AudioAttributes attributes); void vibrate(int uid, String opPkg, in VibrationEffect effect, in AudioAttributes attributes, String reason, IBinder token); void cancelVibrate(IBinder token); diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java index a5188e7cd58d..fbd11ca62a0c 100644 --- a/core/java/android/os/SystemVibrator.java +++ b/core/java/android/os/SystemVibrator.java @@ -70,6 +70,20 @@ public class SystemVibrator extends Vibrator { } @Override + public boolean setAlwaysOnEffect(int id, VibrationEffect effect, AudioAttributes attributes) { + if (mService == null) { + Log.w(TAG, "Failed to set always-on effect; no vibrator service."); + return false; + } + try { + return mService.setAlwaysOnEffect(id, effect, attributes); + } catch (RemoteException e) { + Log.w(TAG, "Failed to set always-on effect.", e); + } + return false; + } + + @Override public void vibrate(int uid, String opPkg, VibrationEffect effect, String reason, AudioAttributes attributes) { if (mService == null) { diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java index 28909c88a734..6456d72a4a6f 100644 --- a/core/java/android/os/Vibrator.java +++ b/core/java/android/os/Vibrator.java @@ -17,6 +17,7 @@ package android.os; import android.annotation.IntDef; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.annotation.UnsupportedAppUsage; @@ -152,6 +153,24 @@ public abstract class Vibrator { public abstract boolean hasAmplitudeControl(); /** + * Configure an always-on haptics effect. + * + * @param id The board-specific always-on ID to configure. + * @param effect Vibration effect to assign to always-on id. Passing null will disable it. + * @param attributes {@link AudioAttributes} corresponding to the vibration. For example, + * specify {@link AudioAttributes#USAGE_ALARM} for alarm vibrations or + * {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE} for + * vibrations associated with incoming calls. May only be null when effect is null. + * @hide + */ + @RequiresPermission(android.Manifest.permission.VIBRATE_ALWAYS_ON) + public boolean setAlwaysOnEffect(int id, @Nullable VibrationEffect effect, + @Nullable AudioAttributes attributes) { + Log.w(TAG, "Always-on effects aren't supported"); + return false; + } + + /** * Vibrate constantly for the specified period of time. * * @param milliseconds The number of milliseconds to vibrate. diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index 716a5225ea91..edab97ddba28 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -169,14 +169,6 @@ public class PhoneStateListener { public static final int LISTEN_SIGNAL_STRENGTHS = 0x00000100; /** - * Listen for changes to OTASP mode. - * - * @see #onOtaspChanged - * @hide - */ - public static final int LISTEN_OTASP_CHANGED = 0x00000200; - - /** * Listen for changes to observed cell info. * * @see #onCellInfoChanged @@ -624,29 +616,6 @@ public class PhoneStateListener { // default implementation empty } - - /** - * The Over The Air Service Provisioning (OTASP) has changed on the registered subscription. - * Note, the registration subId comes from {@link TelephonyManager} object which registers - * PhoneStateListener by {@link TelephonyManager#listen(PhoneStateListener, int)}. - * If this TelephonyManager object was created with - * {@link TelephonyManager#createForSubscriptionId(int)}, then the callback applies to the - * subId. Otherwise, this callback applies to - * {@link SubscriptionManager#getDefaultSubscriptionId()}. - * - * Requires the READ_PHONE_STATE permission. - * @param otaspMode is integer <code>OTASP_UNKNOWN=1<code> - * means the value is currently unknown and the system should wait until - * <code>OTASP_NEEDED=2<code> or <code>OTASP_NOT_NEEDED=3<code> is received before - * making the decision to perform OTASP or not. - * - * @hide - */ - @UnsupportedAppUsage - public void onOtaspChanged(int otaspMode) { - // default implementation empty - } - /** * Callback invoked when a observed cell info has changed or new cells have been added * or removed on the registered subscription. @@ -1065,14 +1034,6 @@ public class PhoneStateListener { () -> mExecutor.execute(() -> psl.onSignalStrengthsChanged(signalStrength))); } - public void onOtaspChanged(int otaspMode) { - PhoneStateListener psl = mPhoneStateListenerWeakRef.get(); - if (psl == null) return; - - Binder.withCleanCallingIdentity( - () -> mExecutor.execute(() -> psl.onOtaspChanged(otaspMode))); - } - public void onCellInfoChanged(List<CellInfo> cellInfo) { PhoneStateListener psl = mPhoneStateListenerWeakRef.get(); if (psl == null) return; diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index f87a7c57fda4..a7f45a0bd49b 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -606,22 +606,6 @@ public class TelephonyRegistryManager { } /** - * Notify over the air sim provisioning(OTASP) mode changed on certain subscription. - * - * @param subId for which otasp mode changed. - * @param otaspMode latest mode for OTASP e.g, OTASP needed. - * - * @hide - */ - public void notifyOtaspChanged(int subId, int otaspMode) { - try { - sRegistry.notifyOtaspChanged(subId, otaspMode); - } catch (RemoteException ex) { - // system process is dead - } - } - - /** * Notify precise call state changed on certain subscription, including foreground, background * and ringcall states. * diff --git a/core/java/android/util/CloseGuard.java b/core/java/android/util/CloseGuard.java index c39a6c9aac93..6ac769623bff 100644 --- a/core/java/android/util/CloseGuard.java +++ b/core/java/android/util/CloseGuard.java @@ -38,6 +38,11 @@ import android.annotation.NonNull; * public void cleanup() { * guard.close(); * ...; + * if (Build.VERSION.SDK_INT >= 28) { + * Reference.reachabilityFence(this); + * } + * // For full correctness in the absence of a close() call, other methods may also need + * // reachabilityFence() calls. * } * * protected void finalize() throws Throwable { @@ -75,7 +80,9 @@ import android.annotation.NonNull; * public void cleanup() { * guard.close(); * ...; - * Reference.reachabilityFence(this); + * if (Build.VERSION.SDK_INT >= 28) { + * Reference.reachabilityFence(this); + * } * // For full correctness in the absence of a close() call, other methods may also need * // reachabilityFence() calls. * } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 427474c2962a..c859f1109cf2 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -5266,7 +5266,7 @@ public class BatteryStatsImpl extends BatteryStats { // Unknown is included in DATA_CONNECTION_OTHER. int bin = DATA_CONNECTION_OUT_OF_SERVICE; if (hasData) { - if (dataType > 0 && dataType <= TelephonyManager.MAX_NETWORK_TYPE) { + if (dataType > 0 && dataType <= TelephonyManager.getAllNetworkTypes().length) { bin = dataType; } else { switch (serviceType) { diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl index 01f57438a02c..cb67309ce74f 100644 --- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -43,7 +43,6 @@ oneway interface IPhoneStateListener { void onDataConnectionStateChanged(int state, int networkType); void onDataActivity(int direction); void onSignalStrengthsChanged(in SignalStrength signalStrength); - void onOtaspChanged(in int otaspMode); void onCellInfoChanged(in List<CellInfo> cellInfo); void onPreciseCallStateChanged(in PreciseCallState callState); void onPreciseDataConnectionStateChanged(in PreciseDataConnectionState dataConnectionState); diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index f4e63183957e..4551d16214a0 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -67,8 +67,6 @@ interface ITelephonyRegistry { @UnsupportedAppUsage(maxTargetSdk = 28) void notifyCellLocation(in Bundle cellLocation); void notifyCellLocationForSubscriber(in int subId, in Bundle cellLocation); - @UnsupportedAppUsage(maxTargetSdk = 28) - void notifyOtaspChanged(in int subId, in int otaspMode); @UnsupportedAppUsage void notifyCellInfo(in List<CellInfo> cellInfo); void notifyPreciseCallState(int phoneId, int subId, int ringingCallState, diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 81957f577ef2..6aed1e8ffe60 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -560,6 +560,7 @@ enum { MEMINFO_VMALLOC_USED, MEMINFO_PAGE_TABLES, MEMINFO_KERNEL_STACK, + MEMINFO_KERNEL_RECLAIMABLE, MEMINFO_COUNT }; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 8dc84c804055..9ce29e35752e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -635,7 +635,7 @@ <!-- NETWORK_SET_TIME moved from com.android.phone to system server. It should ultimately be removed. --> - <protected-broadcast android:name="android.intent.action.NETWORK_SET_TIME" /> + <protected-broadcast android:name="android.telephony.action.NETWORK_SET_TIME" /> <!-- For tether entitlement recheck--> <protected-broadcast @@ -1868,6 +1868,13 @@ android:description="@string/permdesc_vibrate" android:protectionLevel="normal|instant" /> + <!-- Allows access to the vibrator always-on settings. + <p>Protection level: signature + @hide + --> + <permission android:name="android.permission.VIBRATE_ALWAYS_ON" + android:protectionLevel="signature" /> + <!-- Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming. <p>Protection level: normal diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4b5840e69103..b516c41f3fb6 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3020,10 +3020,6 @@ <!-- Whether to use voip audio mode for ims call --> <bool name="config_use_voip_mode_for_ims">false</bool> - <!-- ImsService package name to bind to by default. If none is specified in an overlay, an - empty string is passed in --> - <string name="config_ims_package"/> - <!-- String array containing numbers that shouldn't be logged. Country-specific. --> <string-array name="unloggable_phone_numbers" /> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 04b86a8fee0f..5cd5c8c930fd 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -295,7 +295,6 @@ <java-symbol type="bool" name="config_enableBurnInProtection" /> <java-symbol type="bool" name="config_hotswapCapable" /> <java-symbol type="bool" name="config_mms_content_disposition_support" /> - <java-symbol type="string" name="config_ims_package" /> <java-symbol type="string" name="config_wwan_network_service_package" /> <java-symbol type="string" name="config_wlan_network_service_package" /> <java-symbol type="string" name="config_wwan_network_service_class" /> diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 51fc1e122153..6543a2e85299 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -234,6 +234,13 @@ applications that come with the platform <permission name="android.permission.WRITE_SECURE_SETTINGS"/> </privapp-permissions> + <privapp-permissions package="com.android.tethering"> + <permission name="android.permission.MANAGE_USB"/> + <permission name="android.permission.MODIFY_PHONE_STATE"/> + <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/> + <permission name="android.permission.UPDATE_APP_OPS_STATS"/> + </privapp-permissions> + <privapp-permissions package="com.android.server.telecom"> <permission name="android.permission.BIND_CONNECTION_SERVICE"/> <permission name="android.permission.BIND_INCALL_SERVICE"/> @@ -333,6 +340,8 @@ applications that come with the platform <permission name="android.permission.ENTER_CAR_MODE_PRIORITIZED"/> <!-- Permission required for Telecom car mode CTS tests. --> <permission name="android.permission.CONTROL_INCALL_EXPERIENCE"/> + <!-- Permission required for Tethering CTS tests. --> + <permission name="android.permission.TETHER_PRIVILEGED"/> </privapp-permissions> <privapp-permissions package="com.android.statementservice"> diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java index 08f417662523..fad7d8062a22 100644 --- a/keystore/java/android/security/Credentials.java +++ b/keystore/java/android/security/Credentials.java @@ -16,11 +16,12 @@ package android.security; +import android.annotation.UnsupportedAppUsage; + import com.android.org.bouncycastle.util.io.pem.PemObject; import com.android.org.bouncycastle.util.io.pem.PemReader; import com.android.org.bouncycastle.util.io.pem.PemWriter; -import android.annotation.UnsupportedAppUsage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -64,6 +65,9 @@ public class Credentials { /** Key prefix for VPN. */ public static final String VPN = "VPN_"; + /** Key prefix for platform VPNs. */ + public static final String PLATFORM_VPN = "PLATFORM_VPN_"; + /** Key prefix for WIFI. */ public static final String WIFI = "WIFI_"; diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index d32e85f01962..ee44d0a606aa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -1,7 +1,5 @@ package com.android.settingslib; -import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN; - import android.annotation.ColorInt; import android.content.Context; import android.content.Intent; @@ -25,6 +23,8 @@ import android.os.UserHandle; import android.os.UserManager; import android.print.PrintManager; import android.provider.Settings; +import android.telephony.AccessNetworkConstants; +import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import com.android.internal.annotations.VisibleForTesting; @@ -420,15 +420,30 @@ public class Utils { // service" or "emergency calls only" text that indicates that voice // is not available. Note that we ignore the IWLAN service state // because that state indicates the use of VoWIFI and not cell service - int state = serviceState.getState(); - int dataState = serviceState.getDataRegState(); + final int state = serviceState.getState(); + final int dataState = serviceState.getDataRegState(); + if (state == ServiceState.STATE_OUT_OF_SERVICE || state == ServiceState.STATE_EMERGENCY_ONLY) { - if (dataState == ServiceState.STATE_IN_SERVICE - && serviceState.getDataNetworkType() != RIL_RADIO_TECHNOLOGY_IWLAN) { + if (dataState == ServiceState.STATE_IN_SERVICE && isNotInIwlan(serviceState)) { return ServiceState.STATE_IN_SERVICE; } } return state; } + + private static boolean isNotInIwlan(ServiceState serviceState) { + final NetworkRegistrationInfo networkRegWlan = serviceState.getNetworkRegistrationInfo( + NetworkRegistrationInfo.DOMAIN_PS, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN); + if (networkRegWlan == null) { + return true; + } + + final boolean isInIwlan = (networkRegWlan.getRegistrationState() + == NetworkRegistrationInfo.REGISTRATION_STATE_HOME) + || (networkRegWlan.getRegistrationState() + == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); + return !isInIwlan; + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java index 4d76e44a3c50..51806e0d3c03 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java @@ -38,6 +38,8 @@ import android.media.AudioManager; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; +import android.telephony.AccessNetworkConstants; +import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.text.TextUtils; @@ -74,6 +76,8 @@ public class UtilsTest { private LocationManager mLocationManager; @Mock private ServiceState mServiceState; + @Mock + private NetworkRegistrationInfo mNetworkRegistrationInfo; @Before public void setUp() { @@ -216,6 +220,7 @@ public class UtilsTest { @Test public void isInService_voiceInService_returnTrue() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.isInService(mServiceState)).isTrue(); } @@ -223,15 +228,23 @@ public class UtilsTest { public void isInService_voiceOutOfServiceDataInService_returnTrue() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE); + when(mServiceState.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN)).thenReturn(mNetworkRegistrationInfo); + when(mNetworkRegistrationInfo.getRegistrationState()).thenReturn( + NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN); + assertThat(Utils.isInService(mServiceState)).isTrue(); } @Test public void isInService_voiceOutOfServiceDataInServiceOnIwLan_returnFalse() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); - when(mServiceState.getDataNetworkType()) - .thenReturn(ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN); + when(mServiceState.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN)).thenReturn(mNetworkRegistrationInfo); + when(mNetworkRegistrationInfo.getRegistrationState()).thenReturn( + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.isInService(mServiceState)).isFalse(); } @@ -239,12 +252,14 @@ public class UtilsTest { public void isInService_voiceOutOfServiceDataOutOfService_returnFalse() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + assertThat(Utils.isInService(mServiceState)).isFalse(); } @Test public void isInService_ServiceStatePowerOff_returnFalse() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_POWER_OFF); + assertThat(Utils.isInService(mServiceState)).isFalse(); } @@ -257,6 +272,7 @@ public class UtilsTest { @Test public void getCombinedServiceState_ServiceStatePowerOff_returnPowerOff() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_POWER_OFF); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( ServiceState.STATE_POWER_OFF); } @@ -264,6 +280,7 @@ public class UtilsTest { @Test public void getCombinedServiceState_voiceInService_returnInService() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( ServiceState.STATE_IN_SERVICE); } @@ -272,14 +289,33 @@ public class UtilsTest { public void getCombinedServiceState_voiceOutOfServiceDataInService_returnInService() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE); + when(mServiceState.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN)).thenReturn(mNetworkRegistrationInfo); + when(mNetworkRegistrationInfo.getRegistrationState()).thenReturn( + NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( ServiceState.STATE_IN_SERVICE); } @Test + public void getCombinedServiceState_voiceOutOfServiceDataInServiceOnIwLan_returnOutOfService() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE); + when(mServiceState.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN)).thenReturn(mNetworkRegistrationInfo); + when(mNetworkRegistrationInfo.getRegistrationState()).thenReturn( + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( + ServiceState.STATE_OUT_OF_SERVICE); + } + + @Test public void getCombinedServiceState_voiceOutOfServiceDataOutOfService_returnOutOfService() { when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( ServiceState.STATE_OUT_OF_SERVICE); } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 092eedf87f9d..efd31ca6a86e 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -213,6 +213,9 @@ <!-- Permission required for CTS test - CarModeInCallServiceTest --> <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/> + <!-- Permission required for CTS test - TetheringManagerTest --> + <uses-permission android:name="android.permission.TETHER_PRIVILEGED"/> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" @@ -246,6 +249,7 @@ <activity android:name=".BugreportWarningActivity" + android:theme="@*android:style/Theme.DeviceDefault.Dialog.Alert.DayNight" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" android:exported="false" /> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 0278258ea4b2..582775eaa888 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -91,7 +91,8 @@ public class MobileSignalController extends SignalController< @VisibleForTesting boolean mIsShowingIconGracefully = false; // Some specific carriers have 5GE network which is special LTE CA network. - private static final int NETWORK_TYPE_LTE_CA_5GE = TelephonyManager.MAX_NETWORK_TYPE + 1; + private static final int NETWORK_TYPE_LTE_CA_5GE = + TelephonyManager.getAllNetworkTypes().length + 1; // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't // need listener lists anymore. diff --git a/services/core/java/com/android/server/NetworkTimeUpdateServiceImpl.java b/services/core/java/com/android/server/NetworkTimeUpdateServiceImpl.java index b0b45f411d34..39be311e902d 100644 --- a/services/core/java/com/android/server/NetworkTimeUpdateServiceImpl.java +++ b/services/core/java/com/android/server/NetworkTimeUpdateServiceImpl.java @@ -35,11 +35,11 @@ import android.os.Message; import android.os.PowerManager; import android.os.SystemClock; import android.provider.Settings; +import android.telephony.TelephonyManager; import android.util.Log; import android.util.NtpTrustedTime; import android.util.TimeUtils; -import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.DumpUtils; import java.io.FileDescriptor; @@ -137,7 +137,7 @@ public class NetworkTimeUpdateServiceImpl extends Binder implements NetworkTimeU private void registerForTelephonyIntents() { IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIME); + intentFilter.addAction(TelephonyManager.ACTION_NETWORK_SET_TIME); mContext.registerReceiver(mNitzReceiver, intentFilter); } @@ -247,7 +247,7 @@ public class NetworkTimeUpdateServiceImpl extends Binder implements NetworkTimeU public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (DBG) Log.d(TAG, "Received " + action); - if (TelephonyIntents.ACTION_NETWORK_SET_TIME.equals(action)) { + if (TelephonyManager.ACTION_NETWORK_SET_TIME.equals(action)) { mNitzTimeSetTime = SystemClock.elapsedRealtime(); } } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 92f6241a79a3..08cec2e07753 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -208,8 +208,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { private int[] mDataConnectionNetworkType; - private int[] mOtaspMode; - private ArrayList<List<CellInfo>> mCellInfo = null; private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList; @@ -403,7 +401,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCallForwarding = copyOf(mCallForwarding, mNumPhones); mCellLocation = copyOf(mCellLocation, mNumPhones); mSrvccState = copyOf(mSrvccState, mNumPhones); - mOtaspMode = copyOf(mOtaspMode, mNumPhones); mPreciseCallState = copyOf(mPreciseCallState, mNumPhones); mForegroundCallState = copyOf(mForegroundCallState, mNumPhones); mBackgroundCallState = copyOf(mBackgroundCallState, mNumPhones); @@ -441,7 +438,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCellInfo.add(i, null); mImsReasonInfo.add(i, null); mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE; - mOtaspMode[i] = TelephonyManager.OTASP_UNKNOWN; mCallDisconnectCause[i] = DisconnectCause.NOT_VALID; mCallPreciseDisconnectCause[i] = PreciseDisconnectCause.NOT_VALID; mCallQuality[i] = createCallQuality(); @@ -504,7 +500,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCallForwarding = new boolean[numPhones]; mCellLocation = new Bundle[numPhones]; mSrvccState = new int[numPhones]; - mOtaspMode = new int[numPhones]; mPreciseCallState = new PreciseCallState[numPhones]; mForegroundCallState = new int[numPhones]; mBackgroundCallState = new int[numPhones]; @@ -536,7 +531,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCellInfo.add(i, null); mImsReasonInfo.add(i, null); mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE; - mOtaspMode[i] = TelephonyManager.OTASP_UNKNOWN; mCallDisconnectCause[i] = DisconnectCause.NOT_VALID; mCallPreciseDisconnectCause[i] = PreciseDisconnectCause.NOT_VALID; mCallQuality[i] = createCallQuality(); @@ -867,13 +861,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } - if ((events & PhoneStateListener.LISTEN_OTASP_CHANGED) != 0) { - try { - r.callback.onOtaspChanged(mOtaspMode[phoneId]); - } catch (RemoteException ex) { - remove(r.binder); - } - } if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) { try { if (DBG_LOC) log("listen: mCellInfo[" + phoneId + "] = " @@ -1637,29 +1624,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } - public void notifyOtaspChanged(int subId, int otaspMode) { - if (!checkNotifyPermission("notifyOtaspChanged()" )) { - return; - } - int phoneId = SubscriptionManager.getPhoneId(subId); - synchronized (mRecords) { - if (validatePhoneId(phoneId)) { - mOtaspMode[phoneId] = otaspMode; - for (Record r : mRecords) { - if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_OTASP_CHANGED) - && idMatch(r.subId, subId, phoneId)) { - try { - r.callback.onOtaspChanged(otaspMode); - } catch (RemoteException ex) { - mRemoveList.add(r.binder); - } - } - } - } - handleRemoveListLocked(); - } - } - public void notifyPreciseCallState(int phoneId, int subId, int ringingCallState, int foregroundCallState, int backgroundCallState) { if (!checkNotifyPermission("notifyPreciseCallState()")) { @@ -2084,7 +2048,6 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mCellInfo=" + mCellInfo.get(i)); pw.println("mImsCallDisconnectCause=" + mImsReasonInfo.get(i)); pw.println("mSrvccState=" + mSrvccState[i]); - pw.println("mOtaspMode=" + mOtaspMode[i]); pw.println("mCallPreciseDisconnectCause=" + mCallPreciseDisconnectCause[i]); pw.println("mCallQuality=" + mCallQuality[i]); pw.println("mCallAttributes=" + mCallAttributes[i]); diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 0db8495e9af9..a1480e305d9e 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -60,6 +60,7 @@ import android.provider.DeviceConfig; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.util.DebugUtils; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.StatsLog; @@ -161,6 +162,8 @@ public class VibratorService extends IVibratorService.Stub private int mHapticFeedbackIntensity; private int mNotificationIntensity; private int mRingIntensity; + private SparseArray<Pair<VibrationEffect, AudioAttributes>> mAlwaysOnEffects = + new SparseArray<>(); static native boolean vibratorExists(); static native void vibratorInit(); @@ -172,6 +175,8 @@ public class VibratorService extends IVibratorService.Stub static native boolean vibratorSupportsExternalControl(); static native void vibratorSetExternalControl(boolean enabled); static native long vibratorGetCapabilities(); + static native void vibratorAlwaysOnEnable(long id, long effect, long strength); + static native void vibratorAlwaysOnDisable(long id); private final IUidObserver mUidObserver = new IUidObserver.Stub() { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) { @@ -518,6 +523,41 @@ public class VibratorService extends IVibratorService.Stub } } + @Override // Binder call + public boolean setAlwaysOnEffect(int id, VibrationEffect effect, AudioAttributes attrs) { + if (!hasPermission(android.Manifest.permission.VIBRATE_ALWAYS_ON)) { + throw new SecurityException("Requires VIBRATE_ALWAYS_ON permission"); + } + if ((mCapabilities & IVibrator.CAP_ALWAYS_ON_CONTROL) == 0) { + Slog.e(TAG, "Always-on effects not supported."); + return false; + } + if (effect == null) { + synchronized (mLock) { + mAlwaysOnEffects.delete(id); + vibratorAlwaysOnDisable(id); + } + } else { + if (!verifyVibrationEffect(effect)) { + return false; + } + if (!(effect instanceof VibrationEffect.Prebaked)) { + Slog.e(TAG, "Only prebaked effects supported for always-on."); + return false; + } + if (attrs == null) { + attrs = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_UNKNOWN) + .build(); + } + synchronized (mLock) { + mAlwaysOnEffects.put(id, Pair.create(effect, attrs)); + updateAlwaysOnLocked(id, effect, attrs); + } + } + return true; + } + private void verifyIncomingUid(int uid) { if (uid == Binder.getCallingUid()) { return; @@ -988,6 +1028,8 @@ public class VibratorService extends IVibratorService.Stub // If the state changes out from under us then just reset. doCancelVibrateLocked(); } + + updateAlwaysOnLocked(); } } @@ -1054,6 +1096,27 @@ public class VibratorService extends IVibratorService.Stub mVibrator.getDefaultRingVibrationIntensity(), UserHandle.USER_CURRENT); } + private void updateAlwaysOnLocked(int id, VibrationEffect effect, AudioAttributes attrs) { + // TODO: Check DND and LowPower settings + final Vibration vib = new Vibration(null, effect, attrs, 0, null, null); + final int intensity = getCurrentIntensityLocked(vib); + if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { + vibratorAlwaysOnDisable(id); + } else { + final VibrationEffect.Prebaked prebaked = (VibrationEffect.Prebaked) effect; + final int strength = intensityToEffectStrength(intensity); + vibratorAlwaysOnEnable(id, prebaked.getId(), strength); + } + } + + private void updateAlwaysOnLocked() { + for (int i = 0; i < mAlwaysOnEffects.size(); i++) { + int id = mAlwaysOnEffects.keyAt(i); + Pair<VibrationEffect, AudioAttributes> pair = mAlwaysOnEffects.valueAt(i); + updateAlwaysOnLocked(id, pair.first, pair.second); + } + } + @Override public void onInputDeviceAdded(int deviceId) { updateVibrators(); diff --git a/services/core/java/com/android/server/integrity/OWNERS b/services/core/java/com/android/server/integrity/OWNERS index 019aa4fb0f2b..55a4e409c767 100644 --- a/services/core/java/com/android/server/integrity/OWNERS +++ b/services/core/java/com/android/server/integrity/OWNERS @@ -3,4 +3,3 @@ khelmy@google.com mdchurchill@google.com sturla@google.com songpan@google.com -bjy@google.com diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 4db71c597f2a..990492f65c84 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1026,6 +1026,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // READ_NETWORK_USAGE_HISTORY permission above. synchronized (mNetworkPoliciesSecondLock) { + updateNetworkRulesNL(); updateNetworkEnabledNL(); updateNotificationsNL(); } diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 16424f2fef76..a943e77284ec 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -873,6 +873,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { + mPersistThreshold); } + final long oldGlobalAlertBytes = mGlobalAlertBytes; + // update and persist if beyond new thresholds final long currentTime = mClock.millis(); synchronized (mStatsLock) { @@ -886,8 +888,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mUidTagRecorder.maybePersistLocked(currentTime); } - // re-arm global alert - registerGlobalAlert(); + if (oldGlobalAlertBytes != mGlobalAlertBytes) { + registerGlobalAlert(); + } } @Override diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index 0a6b38fb2e9a..d81728d31f6e 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -41,12 +41,12 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; +import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.Log; import android.util.TimingsTraceLog; import android.view.WindowManager; -import com.android.internal.telephony.ITelephony; import com.android.server.RescueParty; import com.android.server.LocalServices; import com.android.server.pm.PackageManagerService; @@ -584,19 +584,15 @@ public final class ShutdownThread extends Thread { TimingsTraceLog shutdownTimingsTraceLog = newTimingsLog(); boolean radioOff; - final ITelephony phone = - ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); + TelephonyManager telephonyManager = mContext.getSystemService( + TelephonyManager.class); - try { - radioOff = phone == null || !phone.needMobileRadioShutdown(); - if (!radioOff) { - Log.w(TAG, "Turning off cellular radios..."); - metricStarted(METRIC_RADIO); - phone.shutdownMobileRadios(); - } - } catch (RemoteException ex) { - Log.e(TAG, "RemoteException during radio shutdown", ex); - radioOff = true; + radioOff = telephonyManager == null + || !telephonyManager.isAnyRadioPoweredOn(); + if (!radioOff) { + Log.w(TAG, "Turning off cellular radios..."); + metricStarted(METRIC_RADIO); + telephonyManager.shutdownAllRadios(); } Log.i(TAG, "Waiting for Radio..."); @@ -611,12 +607,7 @@ public final class ShutdownThread extends Thread { } if (!radioOff) { - try { - radioOff = !phone.needMobileRadioShutdown(); - } catch (RemoteException ex) { - Log.e(TAG, "RemoteException during radio shutdown", ex); - radioOff = true; - } + radioOff = !telephonyManager.isAnyRadioPoweredOn(); if (radioOff) { Log.i(TAG, "Radio turned off."); metricEnded(METRIC_RADIO); diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java index 1b1ac6d3ed07..d99e03b091a3 100644 --- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java +++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java @@ -23,6 +23,7 @@ import android.app.AlarmManager; import android.app.timedetector.ManualTimeSuggestion; import android.app.timedetector.PhoneTimeSuggestion; import android.content.Intent; +import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.LocalLog; import android.util.Slog; @@ -30,7 +31,6 @@ import android.util.TimestampedValue; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.IndentingPrintWriter; import java.io.PrintWriter; @@ -512,12 +512,12 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { mLastAutoSystemClockTimeSet = null; } - // Historically, Android has sent a TelephonyIntents.ACTION_NETWORK_SET_TIME broadcast only + // Historically, Android has sent a TelephonyManager.ACTION_NETWORK_SET_TIME broadcast only // when setting the time using NITZ. if (origin == ORIGIN_PHONE) { // Send a broadcast that telephony code used to send after setting the clock. // TODO Remove this broadcast as soon as there are no remaining listeners. - Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIME); + Intent intent = new Intent(TelephonyManager.ACTION_NETWORK_SET_TIME); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra("time", newSystemClockMillis); mCallback.sendStickyBroadcast(intent); diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategy.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategy.java index b4d80531be54..b3013c7e0a5f 100644 --- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategy.java +++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategy.java @@ -385,7 +385,7 @@ public class TimeZoneDetectorStrategy { } private static boolean isOriginAutomatic(@Origin int origin) { - return origin == ORIGIN_PHONE; + return origin != ORIGIN_MANUAL; } @GuardedBy("this") @@ -456,15 +456,17 @@ public class TimeZoneDetectorStrategy { * Dumps internal state such as field values. */ public synchronized void dumpState(PrintWriter pw, String[] args) { - pw.println("TimeZoneDetectorStrategy:"); - pw.println("mCallback.isTimeZoneDetectionEnabled()=" + IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); + ipw.println("TimeZoneDetectorStrategy:"); + + ipw.increaseIndent(); // level 1 + ipw.println("mCallback.isTimeZoneDetectionEnabled()=" + mCallback.isAutoTimeZoneDetectionEnabled()); - pw.println("mCallback.isDeviceTimeZoneInitialized()=" + ipw.println("mCallback.isDeviceTimeZoneInitialized()=" + mCallback.isDeviceTimeZoneInitialized()); - pw.println("mCallback.getDeviceTimeZone()=" + ipw.println("mCallback.getDeviceTimeZone()=" + mCallback.getDeviceTimeZone()); - IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); ipw.println("Time zone change log:"); ipw.increaseIndent(); // level 2 mTimeZoneChangesLog.dump(ipw); @@ -485,8 +487,6 @@ public class TimeZoneDetectorStrategy { ipw.decreaseIndent(); // level 2 ipw.decreaseIndent(); // level 1 ipw.flush(); - - pw.flush(); } /** diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp index dcff5a11aca0..6811e6d0e6f2 100644 --- a/services/core/jni/com_android_server_VibratorService.cpp +++ b/services/core/jni/com_android_server_VibratorService.cpp @@ -410,6 +410,21 @@ static jlong vibratorGetCapabilities(JNIEnv*, jclass) { return 0; } +static void vibratorAlwaysOnEnable(JNIEnv* env, jclass, jlong id, jlong effect, jlong strength) { + auto status = halCall(&aidl::IVibrator::alwaysOnEnable, id, + static_cast<aidl::Effect>(effect), static_cast<aidl::EffectStrength>(strength)); + if (!status.isOk()) { + ALOGE("vibratortAlwaysOnEnable command failed (%s).", status.toString8().string()); + } +} + +static void vibratorAlwaysOnDisable(JNIEnv* env, jclass, jlong id) { + auto status = halCall(&aidl::IVibrator::alwaysOnDisable, id); + if (!status.isOk()) { + ALOGE("vibratorAlwaysOnDisable command failed (%s).", status.toString8().string()); + } +} + static const JNINativeMethod method_table[] = { { "vibratorExists", "()Z", (void*)vibratorExists }, { "vibratorInit", "()V", (void*)vibratorInit }, @@ -422,6 +437,8 @@ static const JNINativeMethod method_table[] = { { "vibratorSupportsExternalControl", "()Z", (void*)vibratorSupportsExternalControl}, { "vibratorSetExternalControl", "(Z)V", (void*)vibratorSetExternalControl}, { "vibratorGetCapabilities", "()J", (void*)vibratorGetCapabilities}, + { "vibratorAlwaysOnEnable", "(JJJ)V", (void*)vibratorAlwaysOnEnable}, + { "vibratorAlwaysOnDisable", "(J)V", (void*)vibratorAlwaysOnDisable}, }; int register_android_server_VibratorService(JNIEnv *env) diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp index 9ceb7706628a..76977a5f5c41 100644 --- a/services/core/jni/com_android_server_security_VerityUtils.cpp +++ b/services/core/jni/com_android_server_security_VerityUtils.cpp @@ -22,6 +22,7 @@ #include <errno.h> #include <fcntl.h> +#include <linux/fsverity.h> #include <string.h> #include <sys/ioctl.h> #include <sys/stat.h> @@ -31,40 +32,6 @@ #include <android-base/unique_fd.h> -// TODO(112037636): Always include once fsverity.h is upstreamed. -#if __has_include(<linux/fsverity.h>) -#include <linux/fsverity.h> -#else - -#include <linux/limits.h> -#include <linux/ioctl.h> -#include <linux/types.h> - -#define FS_VERITY_HASH_ALG_SHA256 1 - -struct fsverity_enable_arg { - __u32 version; - __u32 hash_algorithm; - __u32 block_size; - __u32 salt_size; - __u64 salt_ptr; - __u32 sig_size; - __u32 __reserved1; - __u64 sig_ptr; - __u64 __reserved2[11]; -}; - -struct fsverity_digest { - __u16 digest_algorithm; - __u16 digest_size; /* input/output */ - __u8 digest[]; -}; - -#define FS_IOC_ENABLE_VERITY _IOW('f', 133, struct fsverity_enable_arg) -#define FS_IOC_MEASURE_VERITY _IOWR('f', 134, struct fsverity_digest) - -#endif - const int kSha256Bytes = 32; namespace android { diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index eecdeed2cd25..d4dd24580aad 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -39,7 +39,6 @@ android_test { "platformprotosnano", "hamcrest-library", "servicestests-utils", - "xml-writer-device-lib", ], aidl: { diff --git a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java index 72679769be8e..cb99c118a407 100644 --- a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java @@ -22,15 +22,13 @@ import android.content.pm.ApplicationInfo; import androidx.test.runner.AndroidJUnit4; -import com.android.compat.annotation.Change; -import com.android.compat.annotation.XmlWriter; - import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.UUID; @RunWith(AndroidJUnit4.class) @@ -50,18 +48,10 @@ public class CompatConfigTest { return dir; } - private void writeChangesToFile(Change[] changes, File f) { - XmlWriter writer = new XmlWriter(); - for (Change change: changes) { - writer.addChange(change); - } - try { - f.createNewFile(); - writer.write(new FileOutputStream(f)); - } catch (IOException e) { - throw new RuntimeException( - "Encountered an error while writing compat config file", e); - } + private void writeToFile(File dir, String filename, String content) throws IOException { + OutputStream os = new FileOutputStream(new File(dir, filename)); + os.write(content.getBytes()); + os.close(); } @Test @@ -173,13 +163,15 @@ public class CompatConfigTest { } @Test - public void testReadConfig() { - Change[] changes = {new Change(1234L, "MY_CHANGE1", false, 2, null), new Change(1235L, - "MY_CHANGE2", true, null, "description"), new Change(1236L, "MY_CHANGE3", false, - null, "")}; + public void testReadConfig() throws IOException { + String configXml = "<config>" + + "<compat-change id=\"1234\" name=\"MY_CHANGE1\" enableAfterTargetSdk=\"2\" />" + + "<compat-change id=\"1235\" name=\"MY_CHANGE2\" disabled=\"true\" />" + + "<compat-change id=\"1236\" name=\"MY_CHANGE3\" />" + + "</config>"; File dir = createTempDir(); - writeChangesToFile(changes, new File(dir.getPath() + "/platform_compat_config.xml")); + writeToFile(dir, "platform_compat_config.xml", configXml); CompatConfig pc = new CompatConfig(); pc.initConfigFromLib(dir); @@ -191,17 +183,18 @@ public class CompatConfigTest { } @Test - public void testReadConfigMultipleFiles() { - Change[] changes1 = {new Change(1234L, "MY_CHANGE1", false, 2, null)}; - Change[] changes2 = {new Change(1235L, "MY_CHANGE2", true, null, ""), new Change(1236L, - "MY_CHANGE3", false, null, null)}; + public void testReadConfigMultipleFiles() throws IOException { + String configXml1 = "<config>" + + "<compat-change id=\"1234\" name=\"MY_CHANGE1\" enableAfterTargetSdk=\"2\" />" + + "</config>"; + String configXml2 = "<config>" + + "<compat-change id=\"1235\" name=\"MY_CHANGE2\" disabled=\"true\" />" + + "<compat-change id=\"1236\" name=\"MY_CHANGE3\" />" + + "</config>"; File dir = createTempDir(); - writeChangesToFile(changes1, - new File(dir.getPath() + "/libcore_platform_compat_config.xml")); - writeChangesToFile(changes2, - new File(dir.getPath() + "/frameworks_platform_compat_config.xml")); - + writeToFile(dir, "libcore_platform_compat_config.xml", configXml1); + writeToFile(dir, "frameworks_platform_compat_config.xml", configXml2); CompatConfig pc = new CompatConfig(); pc.initConfigFromLib(dir); diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index c06327995bc0..0becaf237a73 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -695,6 +695,15 @@ public abstract class Connection extends Conferenceable { public static final String EVENT_CALL_HOLD_FAILED = "android.telecom.event.CALL_HOLD_FAILED"; /** + * Connection event used to inform Telecom when a switch operation on a call has failed. + * <p> + * Sent via {@link #sendConnectionEvent(String, Bundle)}. The {@link Bundle} parameter is + * expected to be null when this connection event is used. + */ + public static final String EVENT_CALL_SWITCH_FAILED = + "android.telecom.event.CALL_SWITCH_FAILED"; + + /** * Connection event used to inform {@link InCallService}s when the process of merging a * Connection into a conference has begun. * <p> diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 20862c525b55..8f62bcb4f4ab 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -485,6 +485,103 @@ public class TelecomManager { "android.telecom.extra.START_CALL_WITH_RTT"; /** + * Start an activity indicating that the completion of an outgoing call or an incoming call + * which was not blocked by the {@link CallScreeningService}, and which was NOT terminated + * while the call was in {@link Call#STATE_AUDIO_PROCESSING}. + * + * The {@link Uri} extra {@link #EXTRA_HANDLE} will contain the uri handle(phone number) for the + * call which completed. + * + * The integer extra {@link #EXTRA_DISCONNECT_CAUSE} will indicate the reason for the call + * disconnection. See {@link #EXTRA_DISCONNECT_CAUSE} for more information. + * + * The integer extra {@link #EXTRA_CALL_DURATION} will indicate the duration of the call. See + * {@link #EXTRA_CALL_DURATION} for more information. + */ + public static final String ACTION_POST_CALL = "android.telecom.action.POST_CALL"; + + /** + * A {@link Uri} extra, which when set on the {@link #ACTION_POST_CALL} intent, indicates the + * uri handle(phone number) of the completed call. + */ + public static final String EXTRA_HANDLE = "android.telecom.extra.HANDLE"; + + /** + * A integer value provided for completed calls to indicate the reason for the call + * disconnection. + * <p> + * Allowed values: + * <ul> + * <li>{@link DisconnectCause#UNKNOWN}</li> + * <li>{@link DisconnectCause#LOCAL}</li> + * <li>{@link DisconnectCause#REMOTE}</li> + * <li>{@link DisconnectCause#REJECTED}</li> + * <li>{@link DisconnectCause#MISSED}</li> + * </ul> + * </p> + */ + public static final String EXTRA_DISCONNECT_CAUSE = "android.telecom.extra.DISCONNECT_CAUSE"; + + /** + * A integer value provided for completed calls to indicate the duration of the call. + * <p> + * Allowed values: + * <ul> + * <li>{@link #DURATION_VERY_SHORT}</li> + * <li>{@link #DURATION_SHORT}</li> + * <li>{@link #DURATION_MEDIUM}</li> + * <li>{@link #DURATION_LONG}</li> + * </ul> + * </p> + */ + public static final String EXTRA_CALL_DURATION = "android.telecom.extra.CALL_DURATION"; + + /** + * A integer value for {@link #EXTRA_CALL_DURATION}, indicates the duration of the completed + * call was < 3 seconds. + */ + public static final int DURATION_VERY_SHORT = 0; + + /** + * A integer value for {@link #EXTRA_CALL_DURATION}, indicates the duration of the completed + * call was >= 3 seconds and < 60 seconds. + */ + public static final int DURATION_SHORT = 1; + + /** + * A integer value for {@link #EXTRA_CALL_DURATION}, indicates the duration of the completed + * call was >= 60 seconds and < 120 seconds. + */ + public static final int DURATION_MEDIUM = 2; + + /** + * A integer value for {@link #EXTRA_CALL_DURATION}, indicates the duration of the completed + * call was >= 120 seconds. + */ + public static final int DURATION_LONG = 3; + + /** + * The threshold between {@link #DURATION_VERY_SHORT} calls and {@link #DURATION_SHORT} calls in + * milliseconds. + * @hide + */ + public static final long VERY_SHORT_CALL_TIME_MS = 3000; + + /** + * The threshold between {@link #DURATION_SHORT} calls and {@link #DURATION_MEDIUM} calls in + * milliseconds. + * @hide + */ + public static final long SHORT_CALL_TIME_MS = 60000; + + /** + * The threshold between {@link #DURATION_MEDIUM} calls and {@link #DURATION_LONG} calls in + * milliseconds. + * @hide + */ + public static final long MEDIUM_CALL_TIME_MS = 120000; + + /** * A boolean meta-data value indicating whether an {@link InCallService} implements an * in-call user interface. Dialer implementations (see {@link #getDefaultDialerPackage()}) which * would also like to replace the in-call interface should set this meta-data to {@code true} in diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index c04105b0599e..038858003fb4 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -419,12 +419,33 @@ public class CarrierConfigManager { KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY = "gsm_nonroaming_networks_string_array"; /** - * Override the device's configuration for the ImsService to use for this SIM card. + * The package name containing the ImsService that will be bound to the telephony framework to + * support both IMS MMTEL and RCS feature functionality instead of the device default + * ImsService for this subscription. + * @deprecated Use {@link #KEY_CONFIG_IMS_MMTEL_PACKAGE_OVERRIDE_STRING} and + * {@link #KEY_CONFIG_IMS_RCS_PACKAGE_OVERRIDE_STRING} instead to configure these values + * separately. If any of those values are not empty, they will override this value. */ public static final String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string"; /** + * The package name containing the ImsService that will be bound to the telephony framework to + * support IMS MMTEL feature functionality instead of the device default ImsService for this + * subscription. + */ + public static final String KEY_CONFIG_IMS_MMTEL_PACKAGE_OVERRIDE_STRING = + "config_ims_mmtel_package_override_string"; + + /** + * The package name containing the ImsService that will be bound to the telephony framework to + * support IMS RCS feature functionality instead of the device default ImsService for this + * subscription. + */ + public static final String KEY_CONFIG_IMS_RCS_PACKAGE_OVERRIDE_STRING = + "config_ims_rcs_package_override_string"; + + /** * Override the package that will manage {@link SubscriptionPlan} * information instead of the {@link CarrierService} that defines this * value. @@ -1956,6 +1977,12 @@ public class CarrierConfigManager { "allow_add_call_during_video_call"; /** + * When false, indicates that holding a video call is disabled + */ + public static final String KEY_ALLOW_HOLDING_VIDEO_CALL_BOOL = + "allow_holding_video_call"; + + /** * When true, indicates that the HD audio icon in the in-call screen should not be shown for * VoWifi calls. * @hide @@ -2192,7 +2219,7 @@ public class CarrierConfigManager { * the start of the next month. * <p> * This setting may be still overridden by explicit user choice. By default, - * the platform value will be used. + * {@link #DATA_CYCLE_USE_PLATFORM_DEFAULT} will be used. */ public static final String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int"; @@ -2201,10 +2228,7 @@ public class CarrierConfigManager { * When {@link #KEY_MONTHLY_DATA_CYCLE_DAY_INT}, {@link #KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG}, * or {@link #KEY_DATA_WARNING_THRESHOLD_BYTES_LONG} are set to this value, the platform default * value will be used for that key. - * - * @hide */ - @Deprecated public static final int DATA_CYCLE_USE_PLATFORM_DEFAULT = -1; /** @@ -2228,8 +2252,8 @@ public class CarrierConfigManager { * If the value is set to {@link #DATA_CYCLE_THRESHOLD_DISABLED}, the data usage warning will * be disabled. * <p> - * This setting may be overridden by explicit user choice. By default, the platform value - * will be used. + * This setting may be overridden by explicit user choice. By default, + * {@link #DATA_CYCLE_USE_PLATFORM_DEFAULT} will be used. */ public static final String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long"; @@ -2237,8 +2261,7 @@ public class CarrierConfigManager { /** * Controls if the device should automatically notify the user as they reach * their cellular data warning. When set to {@code false} the carrier is - * expected to have implemented their own notification mechanism. - * @hide + * expected to have implemented their own notification mechanism. {@code true} by default. */ public static final String KEY_DATA_WARNING_NOTIFICATION_BOOL = "data_warning_notification_bool"; @@ -2260,8 +2283,8 @@ public class CarrierConfigManager { * phone. If the value is set to {@link #DATA_CYCLE_THRESHOLD_DISABLED}, the data limit will be * disabled. * <p> - * This setting may be overridden by explicit user choice. By default, the platform value - * will be used. + * This setting may be overridden by explicit user choice. By default, + * {@link #DATA_CYCLE_USE_PLATFORM_DEFAULT} will be used. */ public static final String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long"; @@ -2269,8 +2292,7 @@ public class CarrierConfigManager { /** * Controls if the device should automatically notify the user as they reach * their cellular data limit. When set to {@code false} the carrier is - * expected to have implemented their own notification mechanism. - * @hide + * expected to have implemented their own notification mechanism. {@code true} by default. */ public static final String KEY_DATA_LIMIT_NOTIFICATION_BOOL = "data_limit_notification_bool"; @@ -2278,8 +2300,7 @@ public class CarrierConfigManager { /** * Controls if the device should automatically notify the user when rapid * cellular data usage is observed. When set to {@code false} the carrier is - * expected to have implemented their own notification mechanism. - * @hide + * expected to have implemented their own notification mechanism. {@code true} by default. */ public static final String KEY_DATA_RAPID_NOTIFICATION_BOOL = "data_rapid_notification_bool"; @@ -3503,6 +3524,8 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putString(KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING, null); + sDefaults.putString(KEY_CONFIG_IMS_MMTEL_PACKAGE_OVERRIDE_STRING, null); + sDefaults.putString(KEY_CONFIG_IMS_RCS_PACKAGE_OVERRIDE_STRING, null); sDefaults.putStringArray(KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_DIAL_STRING_REPLACE_STRING_ARRAY, null); @@ -3646,6 +3669,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL, false); sDefaults.putBoolean(KEY_ALLOW_MERGE_WIFI_CALLS_WHEN_VOWIFI_OFF_BOOL, true); sDefaults.putBoolean(KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL, true); + sDefaults.putBoolean(KEY_ALLOW_HOLDING_VIDEO_CALL_BOOL, true); sDefaults.putBoolean(KEY_WIFI_CALLS_CAN_BE_HD_AUDIO, true); sDefaults.putBoolean(KEY_VIDEO_CALLS_CAN_BE_HD_AUDIO, true); sDefaults.putBoolean(KEY_GSM_CDMA_CALLS_CAN_BE_HD_AUDIO, false); diff --git a/telephony/java/android/telephony/CbGeoUtils.java b/telephony/java/android/telephony/CbGeoUtils.java index ce5e3f38e78b..eb8f67221578 100644 --- a/telephony/java/android/telephony/CbGeoUtils.java +++ b/telephony/java/android/telephony/CbGeoUtils.java @@ -27,10 +27,15 @@ import java.util.stream.Collectors; /** - * This utils class is specifically used for geo-targeting of CellBroadcast messages. + * This utils class is used for geo-fencing of CellBroadcast messages and is used by the cell + * broadcast module. + * * The coordinates used by this utils class are latitude and longitude, but some algorithms in this * class only use them as coordinates on plane, so the calculation will be inaccurate. So don't use * this class for anything other then geo-targeting of cellbroadcast messages. + * + * More information regarding cell broadcast geo-fencing logic is laid out in 3GPP TS 23.041 and + * ATIS-0700041. * @hide */ @SystemApi @@ -81,7 +86,7 @@ public class CbGeoUtils { /** @hide */ private static final String POLYGON_SYMBOL = "polygon"; - /** Point represent by (latitude, longitude). */ + /** A point represented by (latitude, longitude). */ public static class LatLng { public final double lat; public final double lng; @@ -97,8 +102,8 @@ public class CbGeoUtils { } /** - * @param p the point use to calculate the subtraction result. - * @return the result of this point subtract the given point {@code p}. + * @param p the point to subtract + * @return the result of the subtraction */ @NonNull public LatLng subtract(@NonNull LatLng p) { @@ -106,9 +111,9 @@ public class CbGeoUtils { } /** - * Calculate the distance in meter between this point and the given point {@code p}. - * @param p the point use to calculate the distance. - * @return the distance in meter. + * Calculate the distance in meters between this point and the given point {@code p}. + * @param p the point used to calculate the distance. + * @return the distance in meters. */ public double distance(@NonNull LatLng p) { double dlat = Math.sin(0.5 * Math.toRadians(lat - p.lat)); @@ -125,8 +130,9 @@ public class CbGeoUtils { } /** - * The class represents a simple polygon with at least 3 points. - * @hide + * A class representing a simple polygon with at least 3 points. This is used for geo-fencing + * logic with cell broadcasts. More information regarding cell broadcast geo-fencing logic is + * laid out in 3GPP TS 23.041 and ATIS-0700041. */ public static class Polygon implements Geometry { /** @@ -145,7 +151,7 @@ public class CbGeoUtils { * connected to form an edge of the polygon. The polygon has at least 3 vertices, and the * last vertices and the first vertices must be adjacent. * - * The longitude difference in the vertices should be less than 180 degree. + * The longitude difference in the vertices should be less than 180 degrees. */ public Polygon(@NonNull List<LatLng> vertices) { mVertices = vertices; @@ -164,19 +170,24 @@ public class CbGeoUtils { .collect(Collectors.toList()); } - public List<LatLng> getVertices() { + /** + * Return the list of vertices which compose the polygon. + */ + public @NonNull List<LatLng> getVertices() { return mVertices; } /** - * Check if the given point {@code p} is inside the polygon. This method counts the number - * of times the polygon winds around the point P, A.K.A "winding number". The point is - * outside only when this "winding number" is 0. + * Check if the given LatLng is inside the polygon. * - * If a point is on the edge of the polygon, it is also considered to be inside the polygon. + * If a LatLng is on the edge of the polygon, it is also considered to be inside the + * polygon. */ @Override - public boolean contains(LatLng latLng) { + public boolean contains(@NonNull LatLng latLng) { + // This method counts the number of times the polygon winds around the point P, A.K.A + // "winding number". The point is outside only when this "winding number" is 0. + Point p = convertAndScaleLatLng(latLng); int n = mScaledVertices.size(); @@ -245,6 +256,7 @@ public class CbGeoUtils { return a.x * b.y - a.y * b.x; } + /** @hide */ static final class Point { public final double x; public final double y; @@ -270,29 +282,47 @@ public class CbGeoUtils { } /** - * The class represents a circle. - * @hide + * A class represents a {@link Geometry} in the shape of a Circle. This is used for handling + * geo-fenced cell broadcasts. More information regarding cell broadcast geo-fencing logic is + * laid out in 3GPP TS 23.041 and ATIS-0700041. */ public static class Circle implements Geometry { private final LatLng mCenter; private final double mRadiusMeter; - public Circle(LatLng center, double radiusMeter) { + /** + * Construct a Circle given a center point and a radius in meters. + * + * @param center the latitude and longitude of the center of the circle + * @param radiusInMeters the radius of the circle in meters + */ + public Circle(@NonNull LatLng center, double radiusInMeters) { this.mCenter = center; - this.mRadiusMeter = radiusMeter; + this.mRadiusMeter = radiusInMeters; } - public LatLng getCenter() { + /** + * Return the latitude and longitude of the center of the circle; + */ + public @NonNull LatLng getCenter() { return mCenter; } + /** + * Return the radius of the circle in meters. + */ public double getRadius() { return mRadiusMeter; } + /** + * Check if the given LatLng is inside the circle. + * + * If a LatLng is on the edge of the circle, it is also considered to be inside the circle. + */ @Override - public boolean contains(LatLng p) { - return mCenter.distance(p) <= mRadiusMeter; + public boolean contains(@NonNull LatLng latLng) { + return mCenter.distance(latLng) <= mRadiusMeter; } @Override diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 5b49117be532..6c2dd85076fc 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -2000,6 +2000,27 @@ public final class SmsManager { } } + /** + * Gets the total capacity of SMS storage on RUIM and SIM cards + * + * @return the total capacity count of SMS on RUIM and SIM cards + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public int getSmsCapacityOnIcc() { + int ret = 0; + try { + ISms iccISms = getISmsService(); + if (iccISms != null) { + ret = iccISms.getSmsCapacityOnIccForSubscriber(getSubscriptionId()); + } + } catch (RemoteException ex) { + //ignore it + } + return ret; + } + // see SmsMessage.getStatusOnIcc /** Free space (TS 51.011 10.5.3 / 3GPP2 C.S0023 3.4.27). */ diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 257c60660753..bbde1f48aed7 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -210,6 +210,12 @@ public class SubscriptionInfo implements Parcelable { private int mSubscriptionType; /** + * Whether uicc applications are configured to enable or disable. + * By default it's true. + */ + private boolean mAreUiccApplicationsEnabled = true; + + /** * @hide */ public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName, @@ -220,7 +226,7 @@ public class SubscriptionInfo implements Parcelable { roaming, icon, mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, -1, false, null, false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, - SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null); + SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true); } /** @@ -234,7 +240,7 @@ public class SubscriptionInfo implements Parcelable { this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, roaming, icon, mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, -1, isOpportunistic, groupUUID, false, carrierId, profileClass, - SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null); + SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true); } /** @@ -246,7 +252,8 @@ public class SubscriptionInfo implements Parcelable { @Nullable UiccAccessRule[] nativeAccessRules, String cardString, int cardId, boolean isOpportunistic, @Nullable String groupUUID, boolean isGroupDisabled, int carrierId, int profileClass, int subType, @Nullable String groupOwner, - @Nullable UiccAccessRule[] carrierConfigAccessRules) { + @Nullable UiccAccessRule[] carrierConfigAccessRules, + boolean areUiccApplicationsEnabled) { this.mId = id; this.mIccId = iccId; this.mSimSlotIndex = simSlotIndex; @@ -272,6 +279,7 @@ public class SubscriptionInfo implements Parcelable { this.mSubscriptionType = subType; this.mGroupOwner = groupOwner; this.mCarrierConfigAccessRules = carrierConfigAccessRules; + this.mAreUiccApplicationsEnabled = areUiccApplicationsEnabled; } /** @@ -660,6 +668,15 @@ public class SubscriptionInfo implements Parcelable { return mIsGroupDisabled; } + /** + * Return whether uicc applications are set to be enabled or disabled. + * @hide + */ + @SystemApi + public boolean areUiccApplicationsEnabled() { + return mAreUiccApplicationsEnabled; + } + public static final @android.annotation.NonNull Parcelable.Creator<SubscriptionInfo> CREATOR = new Parcelable.Creator<SubscriptionInfo>() { @Override public SubscriptionInfo createFromParcel(Parcel source) { @@ -691,12 +708,13 @@ public class SubscriptionInfo implements Parcelable { String groupOwner = source.readString(); UiccAccessRule[] carrierConfigAccessRules = source.createTypedArray( UiccAccessRule.CREATOR); + boolean areUiccApplicationsEnabled = source.readBoolean(); SubscriptionInfo info = new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, cardId, isOpportunistic, groupUUID, isGroupDisabled, carrierid, profileClass, subType, groupOwner, - carrierConfigAccessRules); + carrierConfigAccessRules, areUiccApplicationsEnabled); info.setAssociatedPlmns(ehplmns, hplmns); return info; } @@ -736,6 +754,7 @@ public class SubscriptionInfo implements Parcelable { dest.writeStringArray(mHplmns); dest.writeString(mGroupOwner); dest.writeTypedArray(mCarrierConfigAccessRules, flags); + dest.writeBoolean(mAreUiccApplicationsEnabled); } @Override @@ -778,15 +797,16 @@ public class SubscriptionInfo implements Parcelable { + " hplmns=" + Arrays.toString(mHplmns) + " subscriptionType=" + mSubscriptionType + " mGroupOwner=" + mGroupOwner - + " carrierConfigAccessRules=" + mCarrierConfigAccessRules + "}"; + + " carrierConfigAccessRules=" + mCarrierConfigAccessRules + + " mAreUiccApplicationsEnabled=" + mAreUiccApplicationsEnabled + "}"; } @Override public int hashCode() { return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded, - mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, - mCountryIso, mCardString, mCardId, mDisplayName, mCarrierName, mNativeAccessRules, - mIsGroupDisabled, mCarrierId, mProfileClass, mGroupOwner); + mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString, + mCardId, mDisplayName, mCarrierName, mNativeAccessRules, mIsGroupDisabled, + mCarrierId, mProfileClass, mGroupOwner, mAreUiccApplicationsEnabled); } @Override @@ -809,6 +829,7 @@ public class SubscriptionInfo implements Parcelable { && mIsEmbedded == toCompare.mIsEmbedded && mIsOpportunistic == toCompare.mIsOpportunistic && mIsGroupDisabled == toCompare.mIsGroupDisabled + && mAreUiccApplicationsEnabled == toCompare.mAreUiccApplicationsEnabled && mCarrierId == toCompare.mCarrierId && Objects.equals(mGroupUUID, toCompare.mGroupUUID) && Objects.equals(mIccId, toCompare.mIccId) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index f4f0503cfc8f..201c4ce27c55 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -835,6 +835,12 @@ public class SubscriptionManager { public static final String IMSI = "imsi"; /** + * Whether uicc applications is set to be enabled or disabled. By default it's enabled. + * @hide + */ + public static final String UICC_APPLICATIONS_ENABLED = "uicc_applications_enabled"; + + /** * Broadcast Action: The user has changed one of the default subs related to * data, phone calls, or sms</p> * diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index de0b4784c02c..c67ebfe78ef6 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -38,6 +38,9 @@ import android.annotation.UnsupportedAppUsage; import android.annotation.WorkerThread; import android.app.ActivityThread; import android.app.PendingIntent; +import android.compat.Compatibility; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledAfter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -142,6 +145,14 @@ public class TelephonyManager { private static final String TAG = "TelephonyManager"; /** + * To expand the error codes for {@link TelephonyManager#updateAvailableNetworks} and + * {@link TelephonyManager#setPreferredOpportunisticDataSubscription}. + */ + @ChangeId + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) + private static final long CALLBACK_ON_MORE_ERROR_CODE_CHANGE = 130595455L; + + /** * The key to use when placing the result of {@link #requestModemActivityInfo(ResultReceiver)} * into the ResultReceiver Bundle. * @hide @@ -733,8 +744,10 @@ public class TelephonyManager { * Retrieve with * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. * + * @deprecated Should use the {@link TelecomManager#EXTRA_DISCONNECT_CAUSE} instead. * @hide */ + @Deprecated public static final String EXTRA_DISCONNECT_CAUSE = "disconnect_cause"; /** @@ -1449,6 +1462,26 @@ public class TelephonyManager { */ public static final String EXTRA_SIM_COMBINATION_NAMES = "android.telephony.extra.SIM_COMBINATION_NAMES"; + + /** + * Broadcast Action: The time was set by the carrier (typically by the NITZ string). + * This is a sticky broadcast. + * The intent will have the following extra values:</p> + * <ul> + * <li><em>time</em> - The time as a long in UTC milliseconds.</li> + * </ul> + * + * <p class="note"> + * Requires the READ_PHONE_STATE permission. + * + * <p class="note">This is a protected intent that can only be sent + * by the system. + * + * @hide + */ + @SystemApi + public static final String ACTION_NETWORK_SET_TIME = "android.telephony.action.NETWORK_SET_TIME"; + // // // Device Info @@ -2425,7 +2458,7 @@ public class TelephonyManager { /* * When adding a network type to the list below, make sure to add the correct icon to - * MobileSignalController.mapIconSets(). + * MobileSignalController.mapIconSets() as well as NETWORK_TYPES * Do not add negative types. */ /** Network type is unknown */ @@ -2473,8 +2506,36 @@ public class TelephonyManager { /** Current network is NR(New Radio) 5G. */ public static final int NETWORK_TYPE_NR = TelephonyProtoEnums.NETWORK_TYPE_NR; // 20. - /** Max network type number. Update as new types are added. Don't add negative types. {@hide} */ - public static final int MAX_NETWORK_TYPE = NETWORK_TYPE_NR; + private static final @NetworkType int[] NETWORK_TYPES = { + NETWORK_TYPE_GPRS, + NETWORK_TYPE_EDGE, + NETWORK_TYPE_UMTS, + NETWORK_TYPE_CDMA, + NETWORK_TYPE_EVDO_0, + NETWORK_TYPE_EVDO_A, + NETWORK_TYPE_1xRTT, + NETWORK_TYPE_HSDPA, + NETWORK_TYPE_HSUPA, + NETWORK_TYPE_HSPA, + NETWORK_TYPE_IDEN, + NETWORK_TYPE_EVDO_B, + NETWORK_TYPE_LTE, + NETWORK_TYPE_EHRPD, + NETWORK_TYPE_HSPAP, + NETWORK_TYPE_GSM, + NETWORK_TYPE_TD_SCDMA, + NETWORK_TYPE_IWLAN, + NETWORK_TYPE_LTE_CA, + NETWORK_TYPE_NR + }; + + /** + * Return a collection of all network types + * @return network types + */ + public static @NonNull @NetworkType int[] getAllNetworkTypes() { + return NETWORK_TYPES; + } /** * Return the current data network type. @@ -2767,6 +2828,24 @@ public class TelephonyManager { // // + /** @hide */ + @IntDef(prefix = {"SIM_STATE_"}, + value = { + SIM_STATE_UNKNOWN, + SIM_STATE_ABSENT, + SIM_STATE_PIN_REQUIRED, + SIM_STATE_PUK_REQUIRED, + SIM_STATE_NETWORK_LOCKED, + SIM_STATE_READY, + SIM_STATE_NOT_READY, + SIM_STATE_PERM_DISABLED, + SIM_STATE_CARD_IO_ERROR, + SIM_STATE_CARD_RESTRICTED, + SIM_STATE_LOADED, + SIM_STATE_PRESENT, + }) + public @interface SimState {} + /** * SIM card state: Unknown. Signifies that the SIM is in transition * between states. For example, when the user inputs the SIM pin @@ -2972,7 +3051,7 @@ public class TelephonyManager { * @see #SIM_STATE_CARD_IO_ERROR * @see #SIM_STATE_CARD_RESTRICTED */ - public int getSimState() { + public @SimState int getSimState() { int simState = getSimStateIncludingLoaded(); if (simState == SIM_STATE_LOADED) { simState = SIM_STATE_READY; @@ -2980,7 +3059,7 @@ public class TelephonyManager { return simState; } - private int getSimStateIncludingLoaded() { + private @SimState int getSimStateIncludingLoaded() { int slotIndex = getSlotIndex(); // slotIndex may be invalid due to sim being absent. In that case query all slots to get // sim state @@ -3014,7 +3093,7 @@ public class TelephonyManager { * @hide */ @SystemApi - public int getSimCardState() { + public @SimState int getSimCardState() { int simState = getSimState(); return getSimCardStateFromSimState(simState); } @@ -3034,7 +3113,7 @@ public class TelephonyManager { */ @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - public int getSimCardState(int physicalSlotIndex) { + public @SimState int getSimCardState(int physicalSlotIndex) { int simState = getSimState(getLogicalSlotIndex(physicalSlotIndex)); return getSimCardStateFromSimState(simState); } @@ -3044,7 +3123,7 @@ public class TelephonyManager { * @param simState * @return SIM card state */ - private int getSimCardStateFromSimState(int simState) { + private @SimState int getSimCardStateFromSimState(int simState) { switch (simState) { case SIM_STATE_UNKNOWN: case SIM_STATE_ABSENT: @@ -3084,7 +3163,7 @@ public class TelephonyManager { * @hide */ @SystemApi - public int getSimApplicationState() { + public @SimState int getSimApplicationState() { int simState = getSimStateIncludingLoaded(); return getSimApplicationStateFromSimState(simState); } @@ -3107,7 +3186,7 @@ public class TelephonyManager { */ @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - public int getSimApplicationState(int physicalSlotIndex) { + public @SimState int getSimApplicationState(int physicalSlotIndex) { int simState = SubscriptionManager.getSimStateForSlotIndex(getLogicalSlotIndex(physicalSlotIndex)); return getSimApplicationStateFromSimState(simState); @@ -3118,7 +3197,7 @@ public class TelephonyManager { * @param simState * @return SIM application state */ - private int getSimApplicationStateFromSimState(int simState) { + private @SimState int getSimApplicationStateFromSimState(int simState) { switch (simState) { case SIM_STATE_UNKNOWN: case SIM_STATE_ABSENT: @@ -3175,7 +3254,7 @@ public class TelephonyManager { * @see #SIM_STATE_CARD_IO_ERROR * @see #SIM_STATE_CARD_RESTRICTED */ - public int getSimState(int slotIndex) { + public @SimState int getSimState(int slotIndex) { int simState = SubscriptionManager.getSimStateForSlotIndex(slotIndex); if (simState == SIM_STATE_LOADED) { simState = SIM_STATE_READY; @@ -8248,6 +8327,44 @@ public class TelephonyManager { } /** + * Shut down all the live radios over all the slot index. + * + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public void shutdownAllRadios() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.shutdownMobileRadios(); + } + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#shutdownMobileRadios", e); + } + } + + /** + * Check if any radio is on over all the slot indexes. + * + * @return {@code true} if any radio is on over any slot index. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public boolean isAnyRadioPoweredOn() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.needMobileRadioShutdown(); + } + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#needMobileRadioShutdown", e); + } + return false; + } + + /** * Radio explicitly powered off (e.g, airplane mode). * @hide */ @@ -11077,7 +11194,9 @@ public class TelephonyManager { @IntDef(prefix = {"SET_OPPORTUNISTIC_SUB"}, value = { SET_OPPORTUNISTIC_SUB_SUCCESS, SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED, - SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION}) + SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION, + SET_OPPORTUNISTIC_SUB_NO_OPPORTUNISTIC_SUB_AVAILABLE, + SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION}) public @interface SetOpportunisticSubscriptionResult {} /** @@ -11095,6 +11214,16 @@ public class TelephonyManager { */ public static final int SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION = 2; + /** + * The subscription is not valid. It must be an opportunistic subscription. + */ + public static final int SET_OPPORTUNISTIC_SUB_NO_OPPORTUNISTIC_SUB_AVAILABLE = 3; + + /** + * Subscription service happened remote exception. + */ + public static final int SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION = 4; + /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = {"UPDATE_AVAILABLE_NETWORKS"}, value = { @@ -11102,7 +11231,13 @@ public class TelephonyManager { UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE, UPDATE_AVAILABLE_NETWORKS_ABORTED, UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS, - UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE}) + UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE, + UPDATE_AVAILABLE_NETWORKS_DISABLE_MODEM_FAIL, + UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL, + UPDATE_AVAILABLE_NETWORKS_MULTIPLE_NETWORKS_NOT_SUPPORTED, + UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE, + UPDATE_AVAILABLE_NETWORKS_REMOTE_SERVICE_EXCEPTION, + UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED}) public @interface UpdateAvailableNetworksResult {} /** @@ -11131,6 +11266,36 @@ public class TelephonyManager { public static final int UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE = 4; /** + * Disable modem fail. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_DISABLE_MODEM_FAIL = 5; + + /** + * Enable modem fail. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL = 6; + + /** + * Carrier app does not support multiple available networks. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_MULTIPLE_NETWORKS_NOT_SUPPORTED = 7; + + /** + * The subscription is not valid. It must be an opportunistic subscription. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE = 8; + + /** + * There is no OpportunisticNetworkService. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_REMOTE_SERVICE_EXCEPTION = 9; + + /** + * OpportunisticNetworkService is disabled. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED = 10; + + /** * Set preferred opportunistic data subscription id. * * Switch internet data to preferred opportunistic data subscription id. This api @@ -11162,7 +11327,11 @@ public class TelephonyManager { final long identity = Binder.clearCallingIdentity(); try { executor.execute(() -> { - callback.accept(SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION); + if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) { + callback.accept(SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION); + } else { + callback.accept(SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION); + } }); } finally { Binder.restoreCallingIdentity(identity); @@ -11256,9 +11425,12 @@ public class TelephonyManager { if (iOpportunisticNetworkService == null) { final long identity = Binder.clearCallingIdentity(); try { - /* Todo<b/130595455> passing unknown due to lack of good error codes */ executor.execute(() -> { - callback.accept(UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE); + if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) { + callback.accept(UPDATE_AVAILABLE_NETWORKS_REMOTE_SERVICE_EXCEPTION); + } else { + callback.accept(UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE); + } }); } finally { Binder.restoreCallingIdentity(identity); diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index 91aa3ce62cf2..45dd5811c657 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -593,4 +593,12 @@ interface ISms { * @return true for success, false otherwise. */ boolean setSmscAddressOnIccEfForSubscriber(String smsc, int subId, String callingPackage); + + /** + * Get the capacity count of sms on Icc card. + * + * @param subId for subId which getSmsCapacityOnIcc is queried. + * @return capacity of ICC + */ + int getSmsCapacityOnIccForSubscriber(int subId); } diff --git a/telephony/java/com/android/internal/telephony/ISmsImplBase.java b/telephony/java/com/android/internal/telephony/ISmsImplBase.java index d9d4b6002206..020b92b410f1 100644 --- a/telephony/java/com/android/internal/telephony/ISmsImplBase.java +++ b/telephony/java/com/android/internal/telephony/ISmsImplBase.java @@ -212,4 +212,9 @@ public class ISmsImplBase extends ISms.Stub { String smsc, int subId, String callingPackage) { throw new UnsupportedOperationException(); } + + @Override + public int getSmsCapacityOnIccForSubscriber(int subId) { + throw new UnsupportedOperationException(); + } } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 3264c751c90d..feb1368e7d47 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -858,12 +858,13 @@ interface ITelephony { /** * @return true if the ImsService to bind to for the slot id specified was set, false otherwise. */ - boolean setImsService(int slotId, boolean isCarrierImsService, String packageName); + boolean setBoundImsServiceOverride(int slotIndex, boolean isCarrierService, + in int[] featureTypes, in String packageName); /** * @return the package name of the carrier/device ImsService associated with this slot. */ - String getImsService(int slotId, boolean isCarrierImsService); + String getBoundImsServicePackage(int slotIndex, boolean isCarrierImsService, int featureType); /** * Get the MmTelFeature state attached to this subscription id. diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java index b2c3fc79025b..8e1a78c56e0a 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java +++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java @@ -225,22 +225,6 @@ public class TelephonyIntents { public static final String EXTRA_REBROADCAST_ON_UNLOCK= "rebroadcastOnUnlock"; /** - * Broadcast Action: The time was set by the carrier (typically by the NITZ string). - * This is a sticky broadcast. - * The intent will have the following extra values:</p> - * <ul> - * <li><em>time</em> - The time as a long in UTC milliseconds.</li> - * </ul> - * - * <p class="note"> - * Requires the READ_PHONE_STATE permission. - * - * <p class="note">This is a protected intent that can only be sent - * by the system. - */ - public static final String ACTION_NETWORK_SET_TIME = "android.intent.action.NETWORK_SET_TIME"; - - /** * <p>Broadcast Action: It indicates the Emergency callback mode blocks datacall/sms * <p class="note">. * This is to pop up a notice to show user that the phone is in emergency callback mode diff --git a/tests/net/common/java/android/net/LinkPropertiesTest.java b/tests/net/common/java/android/net/LinkPropertiesTest.java index ae8285b8a908..a7eef055a71c 100644 --- a/tests/net/common/java/android/net/LinkPropertiesTest.java +++ b/tests/net/common/java/android/net/LinkPropertiesTest.java @@ -16,7 +16,9 @@ package android.net; +import static com.android.testutils.ParcelUtilsKt.assertParcelSane; import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; +import static com.android.testutils.ParcelUtilsKt.parcelingRoundTrip; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -47,25 +49,22 @@ import java.util.Set; @RunWith(AndroidJUnit4.class) @SmallTest public class LinkPropertiesTest { - private static final InetAddress ADDRV4 = InetAddresses.parseNumericAddress("75.208.6.1"); - private static final InetAddress ADDRV6 = InetAddresses.parseNumericAddress( - "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); - private static final InetAddress DNS1 = InetAddresses.parseNumericAddress("75.208.7.1"); - private static final InetAddress DNS2 = InetAddresses.parseNumericAddress("69.78.7.1"); - private static final InetAddress DNS6 = InetAddresses.parseNumericAddress( - "2001:4860:4860::8888"); - private static final InetAddress PRIVDNS1 = InetAddresses.parseNumericAddress("1.1.1.1"); - private static final InetAddress PRIVDNS2 = InetAddresses.parseNumericAddress("1.0.0.1"); - private static final InetAddress PRIVDNS6 = InetAddresses.parseNumericAddress( - "2606:4700:4700::1111"); - private static final InetAddress PCSCFV4 = InetAddresses.parseNumericAddress("10.77.25.37"); - private static final InetAddress PCSCFV6 = InetAddresses.parseNumericAddress( - "2001:0db8:85a3:0000:0000:8a2e:0370:1"); - private static final InetAddress GATEWAY1 = InetAddresses.parseNumericAddress("75.208.8.1"); - private static final InetAddress GATEWAY2 = InetAddresses.parseNumericAddress("69.78.8.1"); - private static final InetAddress GATEWAY61 = InetAddresses.parseNumericAddress( - "fe80::6:0000:613"); - private static final InetAddress GATEWAY62 = InetAddresses.parseNumericAddress("fe80::6:2222"); + private static final InetAddress ADDRV4 = address("75.208.6.1"); + private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"); + private static final InetAddress DNS1 = address("75.208.7.1"); + private static final InetAddress DNS2 = address("69.78.7.1"); + private static final InetAddress DNS6 = address("2001:4860:4860::8888"); + private static final InetAddress PRIVDNS1 = address("1.1.1.1"); + private static final InetAddress PRIVDNS2 = address("1.0.0.1"); + private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111"); + private static final InetAddress PCSCFV4 = address("10.77.25.37"); + private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1"); + private static final InetAddress GATEWAY1 = address("75.208.8.1"); + private static final InetAddress GATEWAY2 = address("69.78.8.1"); + private static final InetAddress GATEWAY61 = address("fe80::6:0000:613"); + private static final InetAddress GATEWAY62 = address("fe80::6:22%lo"); + private static final InetAddress TESTIPV4ADDR = address("192.168.47.42"); + private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43"); private static final String NAME = "qmi0"; private static final String DOMAINS = "google.com"; private static final String PRIV_DNS_SERVER_NAME = "private.dns.com"; @@ -75,8 +74,7 @@ public class LinkPropertiesTest { private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128); private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64"); - // TODO: replace all calls to NetworkUtils.numericToInetAddress with calls to this method. - private InetAddress Address(String addrString) { + private static InetAddress address(String addrString) { return InetAddresses.parseNumericAddress(addrString); } @@ -228,7 +226,7 @@ public class LinkPropertiesTest { target.clear(); target.setInterfaceName(NAME); // change link addresses - target.addLinkAddress(new LinkAddress(Address("75.208.6.2"), 32)); + target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32)); target.addLinkAddress(LINKADDRV6); target.addDnsServer(DNS1); target.addDnsServer(DNS2); @@ -243,7 +241,7 @@ public class LinkPropertiesTest { target.addLinkAddress(LINKADDRV4); target.addLinkAddress(LINKADDRV6); // change dnses - target.addDnsServer(Address("75.208.7.2")); + target.addDnsServer(address("75.208.7.2")); target.addDnsServer(DNS2); target.addPcscfServer(PCSCFV6); target.addRoute(new RouteInfo(GATEWAY1)); @@ -255,10 +253,10 @@ public class LinkPropertiesTest { target.setInterfaceName(NAME); target.addLinkAddress(LINKADDRV4); target.addLinkAddress(LINKADDRV6); - target.addDnsServer(Address("75.208.7.2")); + target.addDnsServer(address("75.208.7.2")); target.addDnsServer(DNS2); // change pcscf - target.addPcscfServer(Address("2001::1")); + target.addPcscfServer(address("2001::1")); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); target.setMtu(MTU); @@ -271,9 +269,9 @@ public class LinkPropertiesTest { target.addDnsServer(DNS1); target.addDnsServer(DNS2); // change gateway - target.addRoute(new RouteInfo(Address("75.208.8.2"))); - target.addRoute(new RouteInfo(GATEWAY2)); + target.addRoute(new RouteInfo(address("75.208.8.2"))); target.setMtu(MTU); + target.addRoute(new RouteInfo(GATEWAY2)); assertFalse(source.equals(target)); target.clear(); @@ -349,7 +347,7 @@ public class LinkPropertiesTest { @Test public void testRouteInterfaces() { - LinkAddress prefix = new LinkAddress(Address("2001:db8::"), 32); + LinkAddress prefix = new LinkAddress(address("2001:db8::"), 32); InetAddress address = ADDRV6; // Add a route with no interface to a LinkProperties with no interface. No errors. @@ -739,8 +737,7 @@ public class LinkPropertiesTest { // Add an on-link route, making the on-link DNS server reachable, // but there is still no IPv4 address. - assertTrue(v4lp.addRoute(new RouteInfo( - new IpPrefix(NetworkUtils.numericToInetAddress("75.208.0.0"), 16)))); + assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16)))); assertFalse(v4lp.isReachable(DNS1)); assertFalse(v4lp.isReachable(DNS2)); @@ -756,9 +753,9 @@ public class LinkPropertiesTest { assertTrue(v4lp.isReachable(DNS2)); final LinkProperties v6lp = new LinkProperties(); - final InetAddress kLinkLocalDns = Address("fe80::6:1"); - final InetAddress kLinkLocalDnsWithScope = Address("fe80::6:2%43"); - final InetAddress kOnLinkDns = Address("2001:db8:85a3::53"); + final InetAddress kLinkLocalDns = address("fe80::6:1"); + final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43"); + final InetAddress kOnLinkDns = address("2001:db8:85a3::53"); assertFalse(v6lp.isReachable(kLinkLocalDns)); assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope)); assertFalse(v6lp.isReachable(kOnLinkDns)); @@ -767,7 +764,7 @@ public class LinkPropertiesTest { // Add a link-local route, making the link-local DNS servers reachable. Because // we assume the presence of an IPv6 link-local address, link-local DNS servers // are considered reachable, but only those with a non-zero scope identifier. - assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(Address("fe80::"), 64)))); + assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64)))); assertFalse(v6lp.isReachable(kLinkLocalDns)); assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope)); assertFalse(v6lp.isReachable(kOnLinkDns)); @@ -783,7 +780,7 @@ public class LinkPropertiesTest { // Add a global route on link, but no global address yet. DNS servers reachable // via a route that doesn't require a gateway: give them the benefit of the // doubt and hope the link-local source address suffices for communication. - assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(Address("2001:db8:85a3::"), 64)))); + assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64)))); assertFalse(v6lp.isReachable(kLinkLocalDns)); assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope)); assertTrue(v6lp.isReachable(kOnLinkDns)); @@ -812,7 +809,7 @@ public class LinkPropertiesTest { stacked.setInterfaceName("v4-test0"); v6lp.addStackedLink(stacked); - InetAddress stackedAddress = Address("192.0.0.4"); + InetAddress stackedAddress = address("192.0.0.4"); LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32); assertFalse(v6lp.isReachable(stackedAddress)); stacked.addLinkAddress(stackedLinkAddress); @@ -845,7 +842,7 @@ public class LinkPropertiesTest { LinkProperties rmnet1 = new LinkProperties(); rmnet1.setInterfaceName("rmnet1"); rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8")); - RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, Address("10.0.0.1"), + RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"), rmnet1.getInterfaceName()); RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null, rmnet1.getInterfaceName()); @@ -864,7 +861,7 @@ public class LinkPropertiesTest { rmnet2.setInterfaceName("rmnet2"); rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64")); rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64")); - RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, Address("2001:db8::1"), + RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"), rmnet2.getInterfaceName()); RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null, rmnet2.getInterfaceName()); @@ -930,24 +927,54 @@ public class LinkPropertiesTest { public void testLinkPropertiesParcelable() throws Exception { LinkProperties source = new LinkProperties(); source.setInterfaceName(NAME); - // set 2 link addresses + source.addLinkAddress(LINKADDRV4); source.addLinkAddress(LINKADDRV6); - // set 2 dnses + source.addDnsServer(DNS1); source.addDnsServer(DNS2); - // set 2 gateways + source.addDnsServer(GATEWAY62); + + source.addPcscfServer(TESTIPV4ADDR); + source.addPcscfServer(TESTIPV6ADDR); + + source.setUsePrivateDns(true); + source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME); + + source.setDomains(DOMAINS); + source.addRoute(new RouteInfo(GATEWAY1)); source.addRoute(new RouteInfo(GATEWAY2)); - // set 2 validated private dnses + source.addValidatedPrivateDnsServer(DNS6); source.addValidatedPrivateDnsServer(GATEWAY61); + source.addValidatedPrivateDnsServer(TESTIPV6ADDR); + + source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888)); source.setMtu(MTU); + source.setTcpBufferSizes(TCP_BUFFER_SIZES); + source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96")); - assertParcelingIsLossless(source); + source.setWakeOnLanSupported(true); + + final LinkProperties stacked = new LinkProperties(); + stacked.setInterfaceName("test-stacked"); + source.addStackedLink(stacked); + + assertParcelSane(source, 15 /* fieldCount */); + } + + @Test + public void testLinkLocalDnsServerParceling() throws Exception { + final String strAddress = "fe80::1%lo"; + final LinkProperties lp = new LinkProperties(); + lp.addDnsServer(address(strAddress)); + final LinkProperties unparceled = parcelingRoundTrip(lp); + // Inet6Address#equals does not test for the scope id + assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress()); } @Test |