diff options
26 files changed, 501 insertions, 82 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 099248e6ccda..f21518c7f83d 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -40704,6 +40704,7 @@ package android.telephony { method @NonNull public java.util.List<java.lang.Integer> getBands(); method @NonNull public java.util.List<java.lang.String> getMccMncs(); method public int getPriority(); + method @NonNull public java.util.List<android.telephony.RadioAccessSpecifier> getRadioAccessSpecifiers(); method public int getSubId(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.AvailableNetworkInfo> CREATOR; @@ -40712,6 +40713,14 @@ package android.telephony { field public static final int PRIORITY_MED = 2; // 0x2 } + public static final class AvailableNetworkInfo.Builder { + ctor public AvailableNetworkInfo.Builder(int); + method @NonNull public android.telephony.AvailableNetworkInfo build(); + method @NonNull public android.telephony.AvailableNetworkInfo.Builder setMccMncs(@NonNull java.util.List<java.lang.String>); + method @NonNull public android.telephony.AvailableNetworkInfo.Builder setPriority(int); + method @NonNull public android.telephony.AvailableNetworkInfo.Builder setRadioAccessSpecifiers(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>); + } + public final class BarringInfo implements android.os.Parcelable { method public int describeContents(); method @NonNull public android.telephony.BarringInfo.BarringServiceInfo getBarringServiceInfo(int); @@ -47535,6 +47544,10 @@ package android.view { field public static final int KEYCODE_CUT = 277; // 0x115 field public static final int KEYCODE_D = 32; // 0x20 field public static final int KEYCODE_DEL = 67; // 0x43 + field public static final int KEYCODE_DEMO_APP_1 = 301; // 0x12d + field public static final int KEYCODE_DEMO_APP_2 = 302; // 0x12e + field public static final int KEYCODE_DEMO_APP_3 = 303; // 0x12f + field public static final int KEYCODE_DEMO_APP_4 = 304; // 0x130 field public static final int KEYCODE_DPAD_CENTER = 23; // 0x17 field public static final int KEYCODE_DPAD_DOWN = 20; // 0x14 field public static final int KEYCODE_DPAD_DOWN_LEFT = 269; // 0x10d @@ -47566,6 +47579,10 @@ package android.view { field public static final int KEYCODE_F7 = 137; // 0x89 field public static final int KEYCODE_F8 = 138; // 0x8a field public static final int KEYCODE_F9 = 139; // 0x8b + field public static final int KEYCODE_FEATURED_APP_1 = 297; // 0x129 + field public static final int KEYCODE_FEATURED_APP_2 = 298; // 0x12a + field public static final int KEYCODE_FEATURED_APP_3 = 299; // 0x12b + field public static final int KEYCODE_FEATURED_APP_4 = 300; // 0x12c field public static final int KEYCODE_FOCUS = 80; // 0x50 field public static final int KEYCODE_FORWARD = 125; // 0x7d field public static final int KEYCODE_FORWARD_DEL = 112; // 0x70 @@ -47731,6 +47748,14 @@ package android.view { field public static final int KEYCODE_U = 49; // 0x31 field public static final int KEYCODE_UNKNOWN = 0; // 0x0 field public static final int KEYCODE_V = 50; // 0x32 + field public static final int KEYCODE_VIDEO_APP_1 = 289; // 0x121 + field public static final int KEYCODE_VIDEO_APP_2 = 290; // 0x122 + field public static final int KEYCODE_VIDEO_APP_3 = 291; // 0x123 + field public static final int KEYCODE_VIDEO_APP_4 = 292; // 0x124 + field public static final int KEYCODE_VIDEO_APP_5 = 293; // 0x125 + field public static final int KEYCODE_VIDEO_APP_6 = 294; // 0x126 + field public static final int KEYCODE_VIDEO_APP_7 = 295; // 0x127 + field public static final int KEYCODE_VIDEO_APP_8 = 296; // 0x128 field public static final int KEYCODE_VOICE_ASSIST = 231; // 0xe7 field public static final int KEYCODE_VOLUME_DOWN = 25; // 0x19 field public static final int KEYCODE_VOLUME_MUTE = 164; // 0xa4 diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 6ccdf9185517..d0e659bf36e9 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2748,7 +2748,7 @@ package android.view { method public static String actionToString(int); method public final void setDisplayId(int); field public static final int FLAG_IS_ACCESSIBILITY_EVENT = 2048; // 0x800 - field public static final int LAST_KEYCODE = 288; // 0x120 + field public static final int LAST_KEYCODE = 304; // 0x130 } public final class KeyboardShortcutGroup implements android.os.Parcelable { diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index dac8ffe5e008..cf00cbd584a4 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -2022,6 +2022,7 @@ public final class BluetoothAdapter { * {@link BluetoothProfile#HEADSET}, * {@link BluetoothProfile#A2DP}, * {@link BluetoothProfile#HEARING_AID} + * {@link BluetoothProfile#LE_AUDIO} * @return A list of active bluetooth devices * @throws IllegalArgumentException If profile is not one of {@link ActiveDeviceProfile} * @hide @@ -2034,12 +2035,14 @@ public final class BluetoothAdapter { public @NonNull List<BluetoothDevice> getActiveDevices(@ActiveDeviceProfile int profile) { if (profile != BluetoothProfile.HEADSET && profile != BluetoothProfile.A2DP - && profile != BluetoothProfile.HEARING_AID) { + && profile != BluetoothProfile.HEARING_AID + && profile != BluetoothProfile.LE_AUDIO) { Log.e(TAG, "Invalid profile param value in getActiveDevices"); throw new IllegalArgumentException("Profiles must be one of " + "BluetoothProfile.A2DP, " + "BluetoothProfile.HEARING_AID, or" - + "BluetoothProfile.HEARING_AID"); + + "BluetoothProfile.HEARING_AID" + + "BluetoothProfile.LE_AUDIO"); } try { mServiceLock.readLock().lock(); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index d811040b6bb2..e781c2fce2b2 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1147,6 +1147,10 @@ public class Intent implements Parcelable, Cloneable { * numbers. Applications can <strong>dial</strong> emergency numbers using * {@link #ACTION_DIAL}, however. * + * <p>Note: An app filling the {@link android.app.role.RoleManager#ROLE_DIALER} role should use + * {@link android.telecom.TelecomManager#placeCall(Uri, Bundle)} to place calls rather than + * relying on this intent. + * * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#M M} * and above and declares as using the {@link android.Manifest.permission#CALL_PHONE} * permission which is not granted, then attempting to use this action will diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index f3a8b5d79ea0..9f3a847e12eb 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -5365,5 +5365,14 @@ public final class Telephony { */ public static final String COLUMN_D2D_STATUS_SHARING_SELECTED_CONTACTS = "d2d_sharing_contacts"; + + /** + * TelephonyProvider column name for NR Advanced calling + * Determines if the user has enabled VoNR settings for this subscription. + * + * @hide + */ + public static final String COLUMN_NR_ADVANCED_CALLING_ENABLED = + "nr_advanced_calling_enabled"; } } diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index cda9b233576c..ba6f4eb7e598 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -830,13 +830,45 @@ public class KeyEvent extends InputEvent implements Parcelable { * consuming content. May be consumed by system to set account globally. */ public static final int KEYCODE_PROFILE_SWITCH = 288; - - /** + /** Key code constant: Video Application key #1. */ + public static final int KEYCODE_VIDEO_APP_1 = 289; + /** Key code constant: Video Application key #2. */ + public static final int KEYCODE_VIDEO_APP_2 = 290; + /** Key code constant: Video Application key #3. */ + public static final int KEYCODE_VIDEO_APP_3 = 291; + /** Key code constant: Video Application key #4. */ + public static final int KEYCODE_VIDEO_APP_4 = 292; + /** Key code constant: Video Application key #5. */ + public static final int KEYCODE_VIDEO_APP_5 = 293; + /** Key code constant: Video Application key #6. */ + public static final int KEYCODE_VIDEO_APP_6 = 294; + /** Key code constant: Video Application key #7. */ + public static final int KEYCODE_VIDEO_APP_7 = 295; + /** Key code constant: Video Application key #8. */ + public static final int KEYCODE_VIDEO_APP_8 = 296; + /** Key code constant: Featured Application key #1. */ + public static final int KEYCODE_FEATURED_APP_1 = 297; + /** Key code constant: Featured Application key #2. */ + public static final int KEYCODE_FEATURED_APP_2 = 298; + /** Key code constant: Featured Application key #3. */ + public static final int KEYCODE_FEATURED_APP_3 = 299; + /** Key code constant: Featured Application key #4. */ + public static final int KEYCODE_FEATURED_APP_4 = 300; + /** Key code constant: Demo Application key #1. */ + public static final int KEYCODE_DEMO_APP_1 = 301; + /** Key code constant: Demo Application key #2. */ + public static final int KEYCODE_DEMO_APP_2 = 302; + /** Key code constant: Demo Application key #3. */ + public static final int KEYCODE_DEMO_APP_3 = 303; + /** Key code constant: Demo Application key #4. */ + public static final int KEYCODE_DEMO_APP_4 = 304; + + /** * Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent. * @hide */ @TestApi - public static final int LAST_KEYCODE = KEYCODE_PROFILE_SWITCH; + public static final int LAST_KEYCODE = KEYCODE_DEMO_APP_4; // NOTE: If you add a new keycode here you must also add it to: // isSystem() diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 8143cf953f19..ffce4617eec6 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -157,6 +157,7 @@ public final class SurfaceControl implements Parcelable { private static native boolean nativeGetAnimationFrameStats(WindowAnimationFrameStats outStats); private static native long[] nativeGetPhysicalDisplayIds(); + private static native long nativeGetPrimaryPhysicalDisplayId(); private static native IBinder nativeGetPhysicalDisplayToken(long physicalDisplayId); private static native IBinder nativeCreateDisplay(String name, boolean secure); private static native void nativeDestroyDisplay(IBinder displayToken); @@ -2266,6 +2267,15 @@ public final class SurfaceControl implements Parcelable { } /** + * Exposed to identify the correct display to apply the primary display orientation. Avoid using + * for any other purpose. + * @hide + */ + public static long getPrimaryPhysicalDisplayId() { + return nativeGetPrimaryPhysicalDisplayId(); + } + + /** * @hide */ public static IBinder getPhysicalDisplayToken(long physicalDisplayId) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 8d12df226ffe..e47718305b7c 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -889,6 +889,12 @@ static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) { return array; } +static jlong nativeGetPrimaryPhysicalDisplayId(JNIEnv* env, jclass clazz) { + PhysicalDisplayId displayId; + SurfaceComposerClient::getPrimaryPhysicalDisplayId(&displayId); + return static_cast<jlong>(displayId.value); +} + static jobject nativeGetPhysicalDisplayToken(JNIEnv* env, jclass clazz, jlong physicalDisplayId) { sp<IBinder> token = SurfaceComposerClient::getPhysicalDisplayToken(PhysicalDisplayId(physicalDisplayId)); @@ -1879,6 +1885,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeReleaseFrameRateFlexibilityToken }, {"nativeGetPhysicalDisplayIds", "()[J", (void*)nativeGetPhysicalDisplayIds }, + {"nativeGetPrimaryPhysicalDisplayId", "()J", + (void*)nativeGetPrimaryPhysicalDisplayId }, {"nativeGetPhysicalDisplayToken", "(J)Landroid/os/IBinder;", (void*)nativeGetPhysicalDisplayToken }, {"nativeCreateDisplay", "(Ljava/lang/String;Z)Landroid/os/IBinder;", diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a5f505176d5d..dc92e10abf0d 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1984,6 +1984,22 @@ <enum name="KEYCODE_THUMBS_UP" value="286" /> <enum name="KEYCODE_THUMBS_DOWN" value="287" /> <enum name="KEYCODE_PROFILE_SWITCH" value="288" /> + <enum name="KEYCODE_VIDEO_APP_1" value="289" /> + <enum name="KEYCODE_VIDEO_APP_2" value="290" /> + <enum name="KEYCODE_VIDEO_APP_3" value="291" /> + <enum name="KEYCODE_VIDEO_APP_4" value="292" /> + <enum name="KEYCODE_VIDEO_APP_5" value="293" /> + <enum name="KEYCODE_VIDEO_APP_6" value="294" /> + <enum name="KEYCODE_VIDEO_APP_7" value="295" /> + <enum name="KEYCODE_VIDEO_APP_8" value="296" /> + <enum name="KEYCODE_FEATURED_APP_1" value="297" /> + <enum name="KEYCODE_FEATURED_APP_2" value="298" /> + <enum name="KEYCODE_FEATURED_APP_3" value="299" /> + <enum name="KEYCODE_FEATURED_APP_4" value="300" /> + <enum name="KEYCODE_DEMO_APP_1" value="301" /> + <enum name="KEYCODE_DEMO_APP_2" value="302" /> + <enum name="KEYCODE_DEMO_APP_3" value="303" /> + <enum name="KEYCODE_DEMO_APP_4" value="304" /> </attr> <!-- ***************************************************************** --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a350d14d92ab..be5063f3609a 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -64,16 +64,74 @@ <!-- Displayed when a carrier does not support call forwarding queries when roaming. --> <string name="mmiErrorWhileRoaming">Can not change call forwarding settings from your phone while you are roaming.</string> - <!-- Displayed when a phone feature such as call barring was activated. --> + <!-- Displayed when a phone feature such as call forwarding, call waiting, or call barring was + activated. + Used to build messages of the form: + <X> + <Y> + + Where <X> is the name of the service which was enabled. Can be one of: + {@link #BaMmi Call barring}, {@link #CfMmi Call forwarding}, + {@link #PwdMmi Password change}, {@link #CwMmi Call waiting}, + {@link #ClipMmi Incoming Caller ID}, {@link #ClirMmi Hide Outgoing Caller ID}, + {@link #ColpMmi Connected Line ID}, {@link #ColrMmi Connected Line ID Restriction}. + And <Y> is {@link #serviceEnabled} (this string). + --> <string name="serviceEnabled">Service was enabled.</string> <!-- Displayed in front of the list of a set of service classes - (voice, data, fax, etc.) that were enabled. --> + (voice, data, fax, etc.) that call waiting were enabled for. + Will be used with messages of the form: + <X> + <Y1> + ... + <Yn> + Where <X> is {@link #serviceEnabledFor} (this string) and <Y>..<Yn> can be: + {@link #serviceClassData}, {@link #serviceClassVoice}, {@link #serviceClassFAX}, + {@link #serviceClassSMS}, {@link #serviceClassDataAsync}, {@link #serviceClassDataSync}, + {@link #serviceClassPacket}, {@link #serviceClassPAD}. + --> <string name="serviceEnabledFor">Service was enabled for:</string> - <!-- Displayed when a phone feature such as call forwarding was deactivated. --> + <!-- Displayed when a phone feature such as call forwarding was deactivated. + Used to build messages of the form: + <X> + <Y> + + Where <X> is the name of the service which was disabled. Can be one of: + {@link #BaMmi Call barring}, {@link #CfMmi Call forwarding}, + {@link #PwdMmi Password change}, {@link #CwMmi Call waiting}, + {@link #ClipMmi Incoming Caller ID}, {@link #ClirMmi Hide Outgoing Caller ID}, + {@link #ColpMmi Connected Line ID}, {@link #ColrMmi Connected Line ID Restriction}. + And <Y> is {@link #serviceDisabled} (this string). + --> <string name="serviceDisabled">Service has been disabled.</string> - <!-- Displayed when a phone property such as a SIM password was registered. --> + <!-- Displayed when a phone property such as a SIM password was registered. Registration + entails setting up a service for use, where {@link #serviceEnabled} entails enabling a + previously registered service. + Used to build messages of the form: + <X> + <Y> + + Where <X> is the name of the service which was registered. Can be one of: + {@link #BaMmi Call barring}, {@link #CfMmi Call forwarding}, + {@link #PwdMmi Password change}, {@link #CwMmi Call waiting}, + {@link #ClipMmi Incoming Caller ID}, {@link #ClirMmi Hide Outgoing Caller ID}, + {@link #ColpMmi Connected Line ID}, {@link #ColrMmi Connected Line ID Restriction}. + And <Y> is {@link #serviceRegistered} (this string). --> <string name="serviceRegistered">Registration was successful.</string> - <!-- Displayed when a phone property such as a SIM password was erased. --> + <!-- Displayed when a phone property such as a SIM password was erased. + Erasure is the opposite of {@link #serviceRegistered} and entails removal of a service. + + Used to build messages of the form: + <X> + <Y> + + Where <X> is the name of the service which was registered. Can be one of: + {@link #BaMmi Call barring}, {@link #CfMmi Call forwarding}, + {@link #PwdMmi Password change}, {@link #CwMmi Call waiting}, + {@link #ClipMmi Incoming Caller ID}, {@link #ClirMmi Hide Outgoing Caller ID}, + {@link #ColpMmi Connected Line ID}, {@link #ColrMmi Connected Line ID Restriction}. + And <Y> is {@link #serviceErased} (this string). + --> <string name="serviceErased">Erasure was successful.</string> <!-- Displayed when a SIM password was entered incorrectly. --> <string name="passwordIncorrect">Incorrect password.</string> @@ -107,23 +165,32 @@ [CHAR LIMIT=10] --> <string name="meid">MEID</string> - <!-- Displayed as the title for a success/failure report enabling/disabling caller ID. --> + <!-- Displayed as the title for a success/failure report enabling/disabling caller ID. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="ClipMmi">Incoming Caller ID</string> - <!-- Displayed as the title for a success/failure report enabling/disabling caller ID. --> + <!-- Displayed as the title for a success/failure report enabling/disabling caller ID. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="ClirMmi">Hide Outgoing Caller ID</string> - <!-- Displayed as the title for a success/failure report enabling/disabling connected line ID. --> + <!-- Displayed as the title for a success/failure report enabling/disabling connected line ID. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="ColpMmi">Connected Line ID</string> - <!-- Displayed as the title for a success/failure report enabling/disabling connected line ID restriction. --> + <!-- Displayed as the title for a success/failure report enabling/disabling connected line ID restriction. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="ColrMmi">Connected Line ID Restriction</string> - <!-- Displayed as the title for a success/failure report enabling/disabling call forwarding. --> + <!-- Displayed as the title for a success/failure report enabling/disabling call forwarding. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="CfMmi">Call forwarding</string> - <!-- Displayed as the title for a success/failure report enabling/disabling call waiting. --> + <!-- Displayed as the title for a success/failure report enabling/disabling call waiting. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="CwMmi">Call waiting</string> - <!-- Displayed as the title for a success/failure report enabling/disabling call barring. --> + <!-- Displayed as the title for a success/failure report enabling/disabling call barring. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="BaMmi">Call barring</string> - <!-- Displayed as the title for a success/failure report changing the SIM password. --> + <!-- Displayed as the title for a success/failure report changing the SIM password. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="PwdMmi">Password change</string> - <!-- Displayed as the title for a success/failure report changing the SIM PIN. --> + <!-- Displayed as the title for a success/failure report changing the SIM PIN. + See {@link #serviceEnabled}, {@link #serviceDisabled}. --> <string name="PinMmi">PIN change</string> <string name="CnipMmi">Calling number present</string> <string name="CnirMmi">Calling number restricted</string> @@ -198,21 +265,29 @@ <string name="peerTtyModeOff">Peer requested TTY Mode OFF</string> <!-- Mappings between TS 27.007 +CFCC/+CLCK "service classes" and human-readable strings--> <skip /> - <!-- Example: Service was enabled for: Voice, Data --> + <!-- Example: Service was enabled for: Voice, Data + See {@link #serviceEnabledFor}.--> <string name="serviceClassVoice">Voice</string> - <!-- Example: Service was enabled for: Voice, Data --> + <!-- Example: Service was enabled for: Voice, Data. + See {@link #serviceEnabledFor}. --> <string name="serviceClassData">Data</string> - <!-- Example: Service was enabled for: Voice, FAX --> + <!-- Example: Service was enabled for: Voice, FAX + See {@link #serviceEnabledFor}. --> <string name="serviceClassFAX">FAX</string> - <!-- Example: Service was enabled for: Voice, SMS --> + <!-- Example: Service was enabled for: Voice, SMS + See {@link #serviceEnabledFor}. --> <string name="serviceClassSMS">SMS</string> - <!-- Meaning: asynchronous data. Example: Service was enabled for: Voice, Async --> + <!-- Meaning: asynchronous data. Example: Service was enabled for: Voice, Async + See {@link #serviceEnabledFor}. --> <string name="serviceClassDataAsync">Async</string> - <!-- Meaning: synchronous data. Example: Service was enabled for: Voice, Async --> + <!-- Meaning: synchronous data. Example: Service was enabled for: Voice, Async + See {@link #serviceEnabledFor}. --> <string name="serviceClassDataSync">Sync</string> - <!-- Meaning: packet data. Example: Service was enabled for: Voice, Packet --> + <!-- Meaning: packet data. Example: Service was enabled for: Voice, Packet + See {@link #serviceEnabledFor}. --> <string name="serviceClassPacket">Packet</string> - <!-- Meaning: unknown. Example: Service was enabled for: Voice, PAD --> + <!-- Meaning: unknown. Example: Service was enabled for: Voice, PAD + See {@link #serviceEnabledFor}. --> <string name="serviceClassPAD">PAD</string> <!-- CDMA Roaming Indicator Strings (non ERI)--> <skip /> diff --git a/core/tests/coretests/OWNERS b/core/tests/coretests/OWNERS new file mode 100644 index 000000000000..0fb0c3021486 --- /dev/null +++ b/core/tests/coretests/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/services/core/java/com/android/server/am/OWNERS diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index b67988ee9646..c94b3d5ce6b2 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -499,6 +499,12 @@ "group": "WM_DEBUG_STATES", "at": "com\/android\/server\/wm\/ActivityRecord.java" }, + "-1556507536": { + "message": "Passing transform hint %d for window %s%s", + "level": "VERBOSE", + "group": "WM_DEBUG_ORIENTATION", + "at": "com\/android\/server\/wm\/WindowManagerService.java" + }, "-1554521902": { "message": "showInsets(ime) was requested by different window: %s ", "level": "WARN", diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS index ce23a8bc09ca..e1da74466b55 100644 --- a/packages/SystemUI/OWNERS +++ b/packages/SystemUI/OWNERS @@ -11,6 +11,7 @@ asc@google.com awickham@google.com beverlyt@google.com brockman@google.com +brycelee@google.com ccassidy@google.com cinek@google.com cwren@google.com @@ -71,4 +72,4 @@ zakcohen@google.com hseog@google.com #Android TV -rgl@google.com
\ No newline at end of file +rgl@google.com diff --git a/services/core/Android.bp b/services/core/Android.bp index ad3c8442995c..2103bcc01b6a 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -151,7 +151,7 @@ java_library_static { "android.hardware.biometrics.fingerprint-V2.3-java", "android.hardware.biometrics.fingerprint-V1-java", "android.hardware.oemlock-V1.0-java", - "android.hardware.configstore-V1.0-java", + "android.hardware.configstore-V1.1-java", "android.hardware.contexthub-V1.0-java", "android.hardware.rebootescrow-V1-java", "android.hardware.soundtrigger-V2.3-java", diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index 0cd2e3d0ff59..c97ad55ceeec 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -60,6 +60,7 @@ import android.os.Build; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.util.Slog; @@ -70,6 +71,7 @@ import com.android.internal.util.ArrayUtils; import com.android.server.SystemService; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -81,6 +83,8 @@ public class AuthService extends SystemService { private static final String SETTING_HIDL_DISABLED = "com.android.server.biometrics.AuthService.hidlDisabled"; private static final int DEFAULT_HIDL_DISABLED = 0; + private static final String SYSPROP_FIRST_API_LEVEL = "ro.board.first_api_level"; + private static final String SYSPROP_API_LEVEL = "ro.board.api_level"; private final Injector mInjector; @@ -623,7 +627,16 @@ public class AuthService extends SystemService { final SensorConfig[] hidlConfigs; if (!mInjector.isHidlDisabled(getContext())) { - final String[] configStrings = mInjector.getConfiguration(getContext()); + final int firstApiLevel = SystemProperties.getInt(SYSPROP_FIRST_API_LEVEL, 0); + final int apiLevel = SystemProperties.getInt(SYSPROP_API_LEVEL, firstApiLevel); + String[] configStrings = mInjector.getConfiguration(getContext()); + if (configStrings.length == 0 && apiLevel == Build.VERSION_CODES.R) { + // For backwards compatibility with R where biometrics could work without being + // configured in config_biometric_sensors. In the absence of a vendor provided + // configuration, we assume the weakest biometric strength (i.e. convenience). + Slog.w(TAG, "Found R vendor partition without config_biometric_sensors"); + configStrings = generateRSdkCompatibleConfiguration(); + } hidlConfigs = new SensorConfig[configStrings.length]; for (int i = 0; i < configStrings.length; ++i) { hidlConfigs[i] = new SensorConfig(configStrings[i]); @@ -639,6 +652,31 @@ public class AuthService extends SystemService { } /** + * Generates an array of string configs with entries that correspond to the biometric features + * declared on the device. Returns an empty array if no biometric features are declared. + * Biometrics are assumed to be of the weakest strength class, i.e. convenience. + */ + private @NonNull String[] generateRSdkCompatibleConfiguration() { + final PackageManager pm = getContext().getPackageManager(); + final ArrayList<String> modalities = new ArrayList<>(); + if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { + modalities.add(String.valueOf(BiometricAuthenticator.TYPE_FINGERPRINT)); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { + modalities.add(String.valueOf(BiometricAuthenticator.TYPE_FACE)); + } + final String strength = String.valueOf(Authenticators.BIOMETRIC_CONVENIENCE); + final String[] configStrings = new String[modalities.size()]; + for (int i = 0; i < modalities.size(); ++i) { + final String id = String.valueOf(i); + final String modality = modalities.get(i); + configStrings[i] = String.join(":" /* delimiter */, id, modality, strength); + } + Slog.d(TAG, "Generated config_biometric_sensors: " + Arrays.toString(configStrings)); + return configStrings; + } + + /** * Registers HIDL and AIDL authenticators for all of the available modalities. * * @param hidlSensors Array of {@link SensorConfig} configuration for all of the HIDL sensors diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index 73de0f814325..ffc1aed4c672 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -51,6 +51,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; class BluetoothRouteProvider { private static final String TAG = "BTRouteProvider"; @@ -174,8 +175,9 @@ class BluetoothRouteProvider { private void buildBluetoothRoutes() { mBluetoothRoutes.clear(); - if (mBluetoothAdapter.getBondedDevices() != null) { - for (BluetoothDevice device : mBluetoothAdapter.getBondedDevices()) { + Set<BluetoothDevice> bondedDevices = mBluetoothAdapter.getBondedDevices(); + if (bondedDevices != null) { + for (BluetoothDevice device : bondedDevices) { if (device.isConnected()) { BluetoothRouteInfo newBtRoute = createBluetoothRoute(device); if (newBtRoute.connectedProfiles.size() > 0) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 827dfc0caa16..1a0a885d88b4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21918,7 +21918,7 @@ public class PackageManagerService extends IPackageManager.Stub for (int i = 0, size = SYSTEM_PARTITIONS.size(); i < size; i++) { ScanPartition sp = SYSTEM_PARTITIONS.get(i); if (apexInfo.preInstalledApexPath.getAbsolutePath().startsWith( - sp.getFolder().getAbsolutePath())) { + sp.getFolder().getAbsolutePath() + File.separator)) { return new ScanPartition(apexInfo.apexDirectory, sp, SCAN_AS_APK_IN_APEX); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e40882268e67..4a9772093bb7 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2666,6 +2666,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { Slog.wtf(TAG, "KEYCODE_VOICE_ASSIST should be handled in" + " interceptKeyBeforeQueueing"); return key_consumed; + case KeyEvent.KEYCODE_VIDEO_APP_1: + case KeyEvent.KEYCODE_VIDEO_APP_2: + case KeyEvent.KEYCODE_VIDEO_APP_3: + case KeyEvent.KEYCODE_VIDEO_APP_4: + case KeyEvent.KEYCODE_VIDEO_APP_5: + case KeyEvent.KEYCODE_VIDEO_APP_6: + case KeyEvent.KEYCODE_VIDEO_APP_7: + case KeyEvent.KEYCODE_VIDEO_APP_8: + case KeyEvent.KEYCODE_FEATURED_APP_1: + case KeyEvent.KEYCODE_FEATURED_APP_2: + case KeyEvent.KEYCODE_FEATURED_APP_3: + case KeyEvent.KEYCODE_FEATURED_APP_4: + case KeyEvent.KEYCODE_DEMO_APP_1: + case KeyEvent.KEYCODE_DEMO_APP_2: + case KeyEvent.KEYCODE_DEMO_APP_3: + case KeyEvent.KEYCODE_DEMO_APP_4: + Slog.wtf(TAG, "KEYCODE_APP_X should be handled in interceptKeyBeforeQueueing"); + return key_consumed; case KeyEvent.KEYCODE_SYSRQ: if (down && repeatCount == 0) { mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN); @@ -3773,6 +3791,26 @@ public class PhoneWindowManager implements WindowManagerPolicy { } break; } + case KeyEvent.KEYCODE_VIDEO_APP_1: + case KeyEvent.KEYCODE_VIDEO_APP_2: + case KeyEvent.KEYCODE_VIDEO_APP_3: + case KeyEvent.KEYCODE_VIDEO_APP_4: + case KeyEvent.KEYCODE_VIDEO_APP_5: + case KeyEvent.KEYCODE_VIDEO_APP_6: + case KeyEvent.KEYCODE_VIDEO_APP_7: + case KeyEvent.KEYCODE_VIDEO_APP_8: + case KeyEvent.KEYCODE_FEATURED_APP_1: + case KeyEvent.KEYCODE_FEATURED_APP_2: + case KeyEvent.KEYCODE_FEATURED_APP_3: + case KeyEvent.KEYCODE_FEATURED_APP_4: + case KeyEvent.KEYCODE_DEMO_APP_1: + case KeyEvent.KEYCODE_DEMO_APP_2: + case KeyEvent.KEYCODE_DEMO_APP_3: + case KeyEvent.KEYCODE_DEMO_APP_4: { + // Just drop if keys are not intercepted for direct key. + result &= ~ACTION_PASS_TO_USER; + break; + } } // Intercept the Accessibility keychord (CTRL + ALT + Z) for keyboard users. diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 28947083854b..b9ceec15c9ab 100755 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -315,6 +315,7 @@ public final class TvInputManagerService extends SystemService { PackageManager.GET_SERVICES | PackageManager.GET_META_DATA, userId); List<TvInputInfo> inputList = new ArrayList<>(); + List<ComponentName> hardwareComponents = new ArrayList<>(); for (ResolveInfo ri : services) { ServiceInfo si = ri.serviceInfo; if (!android.Manifest.permission.BIND_TV_INPUT.equals(si.permission)) { @@ -325,6 +326,7 @@ public final class TvInputManagerService extends SystemService { ComponentName component = new ComponentName(si.packageName, si.name); if (hasHardwarePermission(pm, component)) { + hardwareComponents.add(component); ServiceState serviceState = userState.serviceStateMap.get(component); if (serviceState == null) { // New hardware input found. Create a new ServiceState and connect to the @@ -397,6 +399,15 @@ public final class TvInputManagerService extends SystemService { } } + // Clean up ServiceState corresponding to the removed hardware inputs + Iterator<ServiceState> it = userState.serviceStateMap.values().iterator(); + while (it.hasNext()) { + ServiceState serviceState = it.next(); + if (serviceState.isHardware && !hardwareComponents.contains(serviceState.component)) { + it.remove(); + } + } + userState.inputMap.clear(); userState.inputMap = inputMap; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 9caef70f6b51..3421b28454f0 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -167,8 +167,10 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; -import android.hardware.configstore.V1_0.ISurfaceFlingerConfigs; import android.hardware.configstore.V1_0.OptionalBool; +import android.hardware.configstore.V1_1.DisplayOrientation; +import android.hardware.configstore.V1_1.ISurfaceFlingerConfigs; +import android.hardware.configstore.V1_1.OptionalDisplayOrientation; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; import android.hardware.input.InputManager; @@ -220,6 +222,7 @@ import android.util.TypedValue; import android.util.proto.ProtoOutputStream; import android.view.Choreographer; import android.view.Display; +import android.view.DisplayAddress; import android.view.DisplayInfo; import android.view.Gravity; import android.view.IAppTransitionAnimationSpecsFuture; @@ -465,6 +468,8 @@ public class WindowManagerService extends IWindowManager.Stub */ static final boolean ENABLE_FIXED_ROTATION_TRANSFORM = SystemProperties.getBoolean("persist.wm.fixed_rotation_transform", true); + private @Surface.Rotation int mPrimaryDisplayOrientation = Surface.ROTATION_0; + private DisplayAddress mPrimaryDisplayPhysicalAddress; // Enums for animation scale update types. @Retention(RetentionPolicy.SOURCE) @@ -2461,16 +2466,21 @@ public class WindowManagerService extends IWindowManager.Stub configChanged = displayContent.updateOrientation(); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); - final DisplayInfo rotatedDisplayInfo = - win.mToken.getFixedRotationTransformDisplayInfo(); - if (rotatedDisplayInfo != null) { - outSurfaceControl.setTransformHint(rotatedDisplayInfo.rotation); - } else { - // We have to update the transform hint of display here, but we need to get if from - // SurfaceFlinger, so set it as rotation of display for most cases, then - // SurfaceFlinger would still update the transform hint of display in next frame. - outSurfaceControl.setTransformHint(displayContent.getDisplayInfo().rotation); - } + final DisplayInfo displayInfo = win.getDisplayInfo(); + int transformHint = displayInfo.rotation; + // If the window is on the primary display, use the panel orientation to adjust the + // transform hint + final boolean isPrimaryDisplay = displayInfo.address != null && + displayInfo.address.equals(mPrimaryDisplayPhysicalAddress); + if (isPrimaryDisplay) { + transformHint = (transformHint + mPrimaryDisplayOrientation) % 4; + } + outSurfaceControl.setTransformHint(transformHint); + ProtoLog.v(WM_DEBUG_ORIENTATION, + "Passing transform hint %d for window %s%s", + transformHint, win, + isPrimaryDisplay ? " on primary display with orientation " + + mPrimaryDisplayOrientation : ""); if (toBeDisplayed && win.mIsWallpaper) { displayContent.mWallpaperController.updateWallpaperOffset(win, false /* sync */); @@ -4868,6 +4878,9 @@ public class WindowManagerService extends IWindowManager.Stub mTaskSnapshotController.systemReady(); mHasWideColorGamutSupport = queryWideColorGamutSupport(); mHasHdrSupport = queryHdrSupport(); + mPrimaryDisplayOrientation = queryPrimaryDisplayOrientation(); + mPrimaryDisplayPhysicalAddress = + DisplayAddress.fromPhysicalDisplayId(SurfaceControl.getPrimaryPhysicalDisplayId()); UiThread.getHandler().post(mSettingsObserver::loadSettings); IVrManager vrManager = IVrManager.Stub.asInterface( ServiceManager.getService(Context.VR_SERVICE)); @@ -4887,6 +4900,9 @@ public class WindowManagerService extends IWindowManager.Stub } } + + // Keep logic in sync with SurfaceFlingerProperties.cpp + // Consider exposing properties via ISurfaceComposer instead. private static boolean queryWideColorGamutSupport() { boolean defaultValue = false; Optional<Boolean> hasWideColorProp = SurfaceFlingerProperties.has_wide_color_display(); @@ -4927,6 +4943,39 @@ public class WindowManagerService extends IWindowManager.Stub return false; } + private static @Surface.Rotation int queryPrimaryDisplayOrientation() { + Optional<SurfaceFlingerProperties.primary_display_orientation_values> prop = + SurfaceFlingerProperties.primary_display_orientation(); + if (prop.isPresent()) { + switch (prop.get()) { + case ORIENTATION_90: return Surface.ROTATION_90; + case ORIENTATION_180: return Surface.ROTATION_180; + case ORIENTATION_270: return Surface.ROTATION_270; + case ORIENTATION_0: + default: + return Surface.ROTATION_0; + } + } + try { + ISurfaceFlingerConfigs surfaceFlinger = ISurfaceFlingerConfigs.getService(); + OptionalDisplayOrientation primaryDisplayOrientation = + surfaceFlinger.primaryDisplayOrientation(); + if (primaryDisplayOrientation != null && primaryDisplayOrientation.specified) { + switch (primaryDisplayOrientation.value) { + case DisplayOrientation.ORIENTATION_90: return Surface.ROTATION_90; + case DisplayOrientation.ORIENTATION_180: return Surface.ROTATION_180; + case DisplayOrientation.ORIENTATION_270: return Surface.ROTATION_270; + case DisplayOrientation.ORIENTATION_0: + default: + return Surface.ROTATION_0; + } + } + } catch (Exception e) { + // Use default value if we can't talk to config store. + } + return Surface.ROTATION_0; + } + void reportFocusChanged(IBinder oldToken, IBinder newToken) { WindowState lastFocus; WindowState newFocus; diff --git a/services/tests/mockingservicestests/OWNERS b/services/tests/mockingservicestests/OWNERS new file mode 100644 index 000000000000..0fb0c3021486 --- /dev/null +++ b/services/tests/mockingservicestests/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/services/core/java/com/android/server/am/OWNERS diff --git a/services/tests/servicestests/OWNERS b/services/tests/servicestests/OWNERS new file mode 100644 index 000000000000..0fb0c3021486 --- /dev/null +++ b/services/tests/servicestests/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/services/core/java/com/android/server/am/OWNERS diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java index cac716efe78f..0ddd52dfc76d 100644 --- a/telecomm/java/android/telecom/InCallService.java +++ b/telecomm/java/android/telecom/InCallService.java @@ -69,7 +69,14 @@ import java.util.List; * them know that the app has crashed and that their call was continued using the pre-loaded dialer * app. * <p> - * Further, the pre-loaded dialer will ALWAYS be used when the user places an emergency call. + * The pre-loaded dialer will ALWAYS be used when the user places an emergency call, even if your + * app fills the {@link android.app.role.RoleManager#ROLE_DIALER} role. To ensure an optimal + * experience when placing an emergency call, the default dialer should ALWAYS use + * {@link android.telecom.TelecomManager#placeCall(Uri, Bundle)} to place calls (including + * emergency calls). This ensures that the platform is able to verify that the request came from + * the default dialer. If a non-preloaded dialer app uses {@link Intent#ACTION_CALL} to place an + * emergency call, it will be raised to the preloaded dialer app using {@link Intent#ACTION_DIAL} + * for confirmation; this is a suboptimal user experience. * <p> * Below is an example manifest registration for an {@code InCallService}. The meta-data * {@link TelecomManager#METADATA_IN_CALL_SERVICE_UI} indicates that this particular diff --git a/telephony/java/android/telephony/AvailableNetworkInfo.java b/telephony/java/android/telephony/AvailableNetworkInfo.java index ae597e02f33c..2b355ae216e3 100644 --- a/telephony/java/android/telephony/AvailableNetworkInfo.java +++ b/telephony/java/android/telephony/AvailableNetworkInfo.java @@ -16,11 +16,14 @@ package android.telephony; +import android.annotation.IntDef; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; import android.telephony.RadioAccessSpecifier; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -32,7 +35,6 @@ import java.util.Objects; * Network Service when passed through {@link TelephonyManager#updateAvailableNetworks} */ public final class AvailableNetworkInfo implements Parcelable { - /* * Defines number of priority level high. */ @@ -48,6 +50,14 @@ public final class AvailableNetworkInfo implements Parcelable { */ public static final int PRIORITY_LOW = 3; + /** @hide */ + @IntDef({ + PRIORITY_HIGH, + PRIORITY_MED, + PRIORITY_LOW, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AvailableNetworkInfoPriority {} /** * subscription Id of the available network. This value must be one of the entry retrieved from * {@link SubscriptionManager#getOpportunisticSubscriptions} @@ -62,7 +72,7 @@ public final class AvailableNetworkInfo implements Parcelable { * for network selection. If there are more than one subId with highest priority then the * network with highest RSRP is chosen. */ - private int mPriority; + private @AvailableNetworkInfoPriority int mPriority; /** * Describes the List of PLMN ids (MCC-MNC) associated with mSubId. @@ -77,8 +87,7 @@ public final class AvailableNetworkInfo implements Parcelable { * Opportunistic network service will use these bands to scan. * * When no specific bands are specified (empty array or null) CBRS band - * {@link AccessNetworkConstants.EutranBand.BAND_48 - * } will be used for network scan. + * {@link AccessNetworkConstants.EutranBand.BAND_48} will be used for network scan. * * See {@link AccessNetworkConstants} for details. * @@ -94,7 +103,7 @@ public final class AvailableNetworkInfo implements Parcelable { * If this entry is left empty, {@link RadioAcccessSpecifier}s with {@link AccessNetworkType}s * of {@link AccessNetworkConstants.AccessNetworkType.EUTRAN} and {@link * AccessNetworkConstants.AccessNetworkType.NGRAN} with bands 48 and 71 on each will be assumed - * by Opportunistic network service. + * by Opportunistic network service for a network scan. */ private ArrayList<RadioAccessSpecifier> mRadioAccessSpecifiers; @@ -117,6 +126,7 @@ public final class AvailableNetworkInfo implements Parcelable { * network with highest RSRP is chosen. * @return priority level */ + @AvailableNetworkInfoPriority public int getPriority() { return mPriority; } @@ -149,15 +159,9 @@ public final class AvailableNetworkInfo implements Parcelable { * Returns a list of {@link RadioAccessSpecifier} associated with the available network. * Opportunistic network service will use this to determine which bands to scan for. * - * the returned value is one of {@link AccessNetworkConstants.AccessNetworkType}. When no - * specific access network type is specified, {@link RadioAccessSpecifier}s with {@link - * AccessNetworkType}s of {@link AccessNetworkConstants.AccessNetworkType.EUTRAN} and {@link - * AccessNetworkConstants.AccessNetworkType.NGRAN} with bands 48 and 71 on each will be assumed - * by Opportunistic network service. * @return the access network type associated with the available network. - * @hide */ - public List<RadioAccessSpecifier> getRadioAccessSpecifiers() { + public @NonNull List<RadioAccessSpecifier> getRadioAccessSpecifiers() { return (List<RadioAccessSpecifier>) mRadioAccessSpecifiers.clone(); } @@ -193,9 +197,9 @@ public final class AvailableNetworkInfo implements Parcelable { } /** @hide */ - private AvailableNetworkInfo(int subId, int priority, @NonNull List<String> mccMncs, - @NonNull List<Integer> bands, @NonNull List<RadioAccessSpecifier> - radioAccessSpecifiers) { + private AvailableNetworkInfo(int subId, @AvailableNetworkInfoPriority int priority, + @NonNull List<String> mccMncs, @NonNull List<Integer> bands, + @NonNull List<RadioAccessSpecifier> radioAccessSpecifiers) { mSubId = subId; mPriority = priority; mMccMncs = new ArrayList<String>(mccMncs); @@ -261,27 +265,39 @@ public final class AvailableNetworkInfo implements Parcelable { * * <pre><code> * - * AvailableNetworkInfo aNI = new AvailableNetworkInfo.Builder() - * .setSubId(1) + * AvailableNetworkInfo aNI = new AvailableNetworkInfo.Builder(subId) * .setPriority(AvailableNetworkInfo.PRIORITY_MED) + * .setRadioAccessSpecifiers(radioAccessSpecifiers) + * .setMccMncs(mccMncs) * .build(); * </code></pre> - * - * @hide */ public static final class Builder { private int mSubId = Integer.MIN_VALUE; - private int mPriority = AvailableNetworkInfo.PRIORITY_LOW; + private @AvailableNetworkInfoPriority int mPriority = AvailableNetworkInfo.PRIORITY_LOW; private ArrayList<String> mMccMncs = new ArrayList<>(); - private ArrayList<Integer> mBands = new ArrayList<>(); private ArrayList<RadioAccessSpecifier> mRadioAccessSpecifiers = new ArrayList<>(); - public @NonNull Builder setSubId(int subId) { + /** + * + */ + /** + * Creates an AvailableNetworkInfo Builder with specified subscription id. + * + * @param subId of the availableNetwork. + */ + public Builder(int subId) { mSubId = subId; - return this; } - public @NonNull Builder setPriority(int priority) { + /** + * Sets the priority for the subscription id. + * + * @param priority of the subscription id. See {@link AvailableNetworkInfo#getPriority} for + * more details + * @return the original Builder object. + */ + public @NonNull Builder setPriority(@AvailableNetworkInfoPriority int priority) { if (priority > AvailableNetworkInfo.PRIORITY_LOW || priority < AvailableNetworkInfo.PRIORITY_HIGH) { throw new IllegalArgumentException("A valid priority must be set"); @@ -290,30 +306,48 @@ public final class AvailableNetworkInfo implements Parcelable { return this; } - public @NonNull Builder setMccMncs(@NonNull ArrayList<String> mccMncs) { - Objects.requireNonNull(mccMncs, "A non-null ArrayList of mccmncs must be set. An empty " - + "list is still accepted. Please read documentation in " - + "AvailableNetworkService to see consequences of an empty Arraylist."); - mMccMncs = mccMncs; + /** + * Sets the list of mccmncs associated with the subscription id. + * + * @param mccMncs nonull list of mccmncs. An empty List is still accepted. Please read + * documentation in {@link AvailableNetworkInfo} to see consequences of an empty List. + * @return the original Builder object. + */ + public @NonNull Builder setMccMncs(@NonNull List<String> mccMncs) { + Objects.requireNonNull(mccMncs, "A non-null List of mccmncs must be set. An empty " + + "List is still accepted. Please read documentation in " + + "AvailableNetworkInfo to see consequences of an empty List."); + mMccMncs = new ArrayList<>(mccMncs); return this; } + /** + * Sets the list of mccmncs associated with the subscription id. + * + * @param radioAccessSpecifiers nonull list of radioAccessSpecifiers. An empty List is still + * accepted. Please read documentation in {@link AvailableNetworkInfo} to see + * consequences of an empty List. + * @return the original Builder object. + */ public @NonNull Builder setRadioAccessSpecifiers( - @NonNull ArrayList<RadioAccessSpecifier> radioAccessSpecifiers) { - Objects.requireNonNull(radioAccessSpecifiers, "A non-null ArrayList of " - + "RadioAccessSpecifiers must be set. An empty list is still accepted. Please " - + "read documentation in AvailableNetworkService to see consequences of an " - + "empty Arraylist."); - mRadioAccessSpecifiers = radioAccessSpecifiers; + @NonNull List<RadioAccessSpecifier> radioAccessSpecifiers) { + Objects.requireNonNull(radioAccessSpecifiers, "A non-null List of " + + "RadioAccessSpecifiers must be set. An empty List is still accepted. Please " + + "read documentation in AvailableNetworkInfo to see consequences of an " + + "empty List."); + mRadioAccessSpecifiers = new ArrayList<>(radioAccessSpecifiers); return this; } + /** + * @return an AvailableNetworkInfo object with all the fields previously set by the Builder. + */ public @NonNull AvailableNetworkInfo build() { if (mSubId == Integer.MIN_VALUE) { throw new IllegalArgumentException("A valid subId must be set"); } - return new AvailableNetworkInfo(mSubId, mPriority, mMccMncs, mBands, + return new AvailableNetworkInfo(mSubId, mPriority, mMccMncs, new ArrayList<>(), mRadioAccessSpecifiers); } } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 543ca05d37a6..894bb8e15333 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -3927,6 +3927,30 @@ public class CarrierConfigManager { public static final String KEY_ENABLE_4G_OPPORTUNISTIC_NETWORK_SCAN_BOOL = "enabled_4g_opportunistic_network_scan_bool"; + /** + * Only relevant when the device supports opportunistic networks but does not support + * simultaneuous 5G+5G. Controls how long, in milliseconds, to wait before opportunistic network + * goes out of service before switching the 5G capability back to primary stack. The idea of + * waiting a few seconds is to minimize the calling of the expensive capability switching + * operation in the case where CBRS goes back into service shortly after going out of it. + * + * @hide + */ + public static final String KEY_TIME_TO_SWITCH_BACK_TO_PRIMARY_IF_OPPORTUNISTIC_OOS_LONG = + "time_to_switch_back_to_primary_if_opportunistic_oos_long"; + + /** + * Only relevant when the device supports opportunistic networks but does not support + * simultaneuous 5G+5G. Controls how long, in milliseconds, after 5G capability has switched back + * to primary stack due to opportunistic network being OOS. The idea is to minimizing the + * 'ping-ponging' effect where device is constantly witching capability back and forth between + * primary and opportunistic stack. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_TIME_TO_SCAN_AFTER_CAPABILITY_SWITCH_TO_PRIMARY_LONG + = "opportunistic_time_to_scan_after_capability_switch_to_primary_long"; + /** * Indicates zero or more emergency number prefix(es), because some carrier requires * if users dial an emergency number address with a specific prefix, the combination of the @@ -5245,6 +5269,16 @@ public class CarrierConfigManager { public static final String KEY_VONR_SETTING_VISIBILITY_BOOL = "vonr_setting_visibility_bool"; /** + * Flag specifying whether VoNR should be enabled for carrier. + * If true, VoNr will be enabled. If false, hard disabled. + * + * Disabled by default. + * + * @hide + */ + public static final String KEY_VONR_ENABLED_BOOL = "vonr_enabled_bool"; + + /** * Determine whether unthrottle data retry when tracking area code (TAC/LAC) from cell changes * * @hide @@ -5793,6 +5827,10 @@ public class CarrierConfigManager { /* Default value is 2 seconds. */ sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_5G_DATA_SWITCH_EXIT_HYSTERESIS_TIME_LONG, 2000); sDefaults.putBoolean(KEY_ENABLE_4G_OPPORTUNISTIC_NETWORK_SCAN_BOOL, true); + sDefaults.putInt(KEY_TIME_TO_SWITCH_BACK_TO_PRIMARY_IF_OPPORTUNISTIC_OOS_LONG, 60000); + sDefaults.putInt( + KEY_OPPORTUNISTIC_TIME_TO_SCAN_AFTER_CAPABILITY_SWITCH_TO_PRIMARY_LONG, + 120000); sDefaults.putAll(Gps.getDefaults()); sDefaults.putIntArray(KEY_CDMA_ENHANCED_ROAMING_INDICATOR_FOR_HOME_NETWORK_INT_ARRAY, new int[] { @@ -5865,6 +5903,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_DISPLAY_NO_DATA_NOTIFICATION_ON_PERMANENT_FAILURE_BOOL, false); sDefaults.putBoolean(KEY_UNTHROTTLE_DATA_RETRY_WHEN_TAC_CHANGES_BOOL, false); sDefaults.putBoolean(KEY_VONR_SETTING_VISIBILITY_BOOL, false); + sDefaults.putBoolean(KEY_VONR_ENABLED_BOOL, false); } /** diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 3b44a34048b8..d5315acf60d5 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -949,6 +949,15 @@ public class SubscriptionManager { public static final String VOIMS_OPT_IN_STATUS = SimInfo.COLUMN_VOIMS_OPT_IN_STATUS; /** + * TelephonyProvider column name for NR Advanced calling + * Determines if the user has enabled VoNR settings for this subscription. + * + * @hide + */ + public static final String NR_ADVANCED_CALLING_ENABLED = + SimInfo.COLUMN_NR_ADVANCED_CALLING_ENABLED; + + /** * Profile class of the subscription * @hide */ |