diff options
| -rw-r--r-- | api/current.txt | 17 | ||||
| -rw-r--r-- | api/system-current.txt | 17 | ||||
| -rw-r--r-- | api/test-current.txt | 17 | ||||
| -rw-r--r-- | docs/html-intl/intl/ko/guide/topics/providers/content-provider-basics.jd | 2 | ||||
| -rw-r--r-- | docs/html-intl/intl/zh-tw/guide/components/intents-filters.jd | 2 | ||||
| -rw-r--r-- | docs/html/training/tv/playback/card.jd | 2 | ||||
| -rw-r--r-- | graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java | 108 | ||||
| -rw-r--r-- | packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java | 43 | ||||
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 6 | ||||
| -rw-r--r-- | telecomm/java/android/telecom/RemoteConnection.java | 7 | ||||
| -rw-r--r-- | telephony/java/android/telephony/CarrierConfigManager.java | 8 |
11 files changed, 169 insertions, 60 deletions
diff --git a/api/current.txt b/api/current.txt index 25c6ab379bfd..7b8930c0cd8e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -52213,7 +52213,9 @@ package java.lang.reflect { method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); method public abstract java.lang.Class<?>[] getParameterTypes(); + method public java.lang.reflect.Parameter[] getParameters(); method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters(); + method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); method public abstract java.lang.String toGenericString(); @@ -52336,6 +52338,21 @@ package java.lang.reflect { field public static final int VOLATILE = 64; // 0x40 } + public final class Parameter implements java.lang.reflect.AnnotatedElement { + method public T getAnnotation(java.lang.Class<T>); + method public java.lang.annotation.Annotation[] getAnnotations(); + method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method public java.lang.reflect.Executable getDeclaringExecutable(); + method public int getModifiers(); + method public java.lang.String getName(); + method public java.lang.reflect.Type getParameterizedType(); + method public java.lang.Class<?> getType(); + method public boolean isImplicit(); + method public boolean isNamePresent(); + method public boolean isSynthetic(); + method public boolean isVarArgs(); + } + public abstract interface ParameterizedType implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getActualTypeArguments(); method public abstract java.lang.reflect.Type getOwnerType(); diff --git a/api/system-current.txt b/api/system-current.txt index 49a976edb36f..ca1c61d433a1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -55750,7 +55750,9 @@ package java.lang.reflect { method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); method public abstract java.lang.Class<?>[] getParameterTypes(); + method public java.lang.reflect.Parameter[] getParameters(); method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters(); + method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); method public abstract java.lang.String toGenericString(); @@ -55873,6 +55875,21 @@ package java.lang.reflect { field public static final int VOLATILE = 64; // 0x40 } + public final class Parameter implements java.lang.reflect.AnnotatedElement { + method public T getAnnotation(java.lang.Class<T>); + method public java.lang.annotation.Annotation[] getAnnotations(); + method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method public java.lang.reflect.Executable getDeclaringExecutable(); + method public int getModifiers(); + method public java.lang.String getName(); + method public java.lang.reflect.Type getParameterizedType(); + method public java.lang.Class<?> getType(); + method public boolean isImplicit(); + method public boolean isNamePresent(); + method public boolean isSynthetic(); + method public boolean isVarArgs(); + } + public abstract interface ParameterizedType implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getActualTypeArguments(); method public abstract java.lang.reflect.Type getOwnerType(); diff --git a/api/test-current.txt b/api/test-current.txt index 8b0b0e80f0c0..eda4019fe592 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -52307,7 +52307,9 @@ package java.lang.reflect { method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); method public abstract java.lang.Class<?>[] getParameterTypes(); + method public java.lang.reflect.Parameter[] getParameters(); method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters(); + method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); method public abstract java.lang.String toGenericString(); @@ -52430,6 +52432,21 @@ package java.lang.reflect { field public static final int VOLATILE = 64; // 0x40 } + public final class Parameter implements java.lang.reflect.AnnotatedElement { + method public T getAnnotation(java.lang.Class<T>); + method public java.lang.annotation.Annotation[] getAnnotations(); + method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method public java.lang.reflect.Executable getDeclaringExecutable(); + method public int getModifiers(); + method public java.lang.String getName(); + method public java.lang.reflect.Type getParameterizedType(); + method public java.lang.Class<?> getType(); + method public boolean isImplicit(); + method public boolean isNamePresent(); + method public boolean isSynthetic(); + method public boolean isVarArgs(); + } + public abstract interface ParameterizedType implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getActualTypeArguments(); method public abstract java.lang.reflect.Type getOwnerType(); diff --git a/docs/html-intl/intl/ko/guide/topics/providers/content-provider-basics.jd b/docs/html-intl/intl/ko/guide/topics/providers/content-provider-basics.jd index 68ed5683d731..0f58b792a24f 100644 --- a/docs/html-intl/intl/ko/guide/topics/providers/content-provider-basics.jd +++ b/docs/html-intl/intl/ko/guide/topics/providers/content-provider-basics.jd @@ -891,7 +891,7 @@ mRowsDeleted = getContentResolver().delete( 사용자 사전 제공자의 데이터 유형은 제공자의 계약 클래스 {@link android.provider.UserDictionary.Words}의 참조 문서에 나열되어 있습니다(계약 클래스는 <a href="#ContractClasses">계약 클래스</a> 섹션에 설명되어 있습니다). - @link android.database.Cursor#getType + {@link android.database.Cursor#getType Cursor.getType()}을 호출해서도 데이터 유형을 결정할 수 있습니다. </p> <p> diff --git a/docs/html-intl/intl/zh-tw/guide/components/intents-filters.jd b/docs/html-intl/intl/zh-tw/guide/components/intents-filters.jd index d3edac3f817a..7e61f5e01ad3 100644 --- a/docs/html-intl/intl/zh-tw/guide/components/intents-filters.jd +++ b/docs/html-intl/intl/zh-tw/guide/components/intents-filters.jd @@ -76,7 +76,7 @@ android.content.Context#bindService bindService()} 來繫結至另一個元件 <li><b>如何傳送廣播:</b> <p>廣播是指任何應用程式都可接收的訊息。系統會傳送各種系統事件廣播,例如系統開機或裝置開始充電。 您可以將 {@link android.content.Intent} 傳送至 {@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}、 -{@link android.content.Context#sendOrderedBroadcast(Intent, String) 或{@link +{@link android.content.Context#sendOrderedBroadcast(Intent, String)} 或{@link android.content.Context#sendStickyBroadcast sendStickyBroadcast()},以向其他應用程式傳送廣播。 diff --git a/docs/html/training/tv/playback/card.jd b/docs/html/training/tv/playback/card.jd index a3a987252a8a..239118543c20 100644 --- a/docs/html/training/tv/playback/card.jd +++ b/docs/html/training/tv/playback/card.jd @@ -43,7 +43,7 @@ Leanback sample app</a> image card view when selected.</p> on demand. In the browse fragment where your app presents its content to the user, you create a {@link android.support.v17.leanback.widget.Presenter} for the content cards and pass it to the adapter that adds the content to the screen. In the following code, the <code>CardPresenter</code> is created -in the {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished(android.support.v4.content.Loader, java.lang.Object) onLoadFinished()} +in the {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} callback of the {@link android.support.v4.app.LoaderManager}.</p> <pre> diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 0f305f3cff3d..dcca431ea754 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -65,19 +65,36 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; /** - * This class uses {@link android.animation.ObjectAnimator} and - * {@link android.animation.AnimatorSet} to animate the properties of a - * {@link android.graphics.drawable.VectorDrawable} to create an animated drawable. + * This class animates properties of a {@link android.graphics.drawable.VectorDrawable} with + * animations defined using {@link android.animation.ObjectAnimator} or + * {@link android.animation.AnimatorSet}. * <p> - * AnimatedVectorDrawable are normally defined as 3 separate XML files. + * Starting from API 25, AnimatedVectorDrawable runs on RenderThread (as opposed to on UI thread for + * earlier APIs). This means animations in AnimatedVectorDrawable can remain smooth even when there + * is heavy workload on the UI thread. Note: If the UI thread is unresponsive, RenderThread may + * continue animating until the UI thread is capable of pushing another frame. Therefore, it is not + * possible to precisely coordinate a RenderThread-enabled AnimatedVectorDrawable with UI thread + * animations. Additionally, + * {@link android.graphics.drawable.Animatable2.AnimationCallback#onAnimationEnd(Drawable)} will be + * called the frame after the AnimatedVectorDrawable finishes on the RenderThread. * </p> * <p> - * First is the XML file for {@link android.graphics.drawable.VectorDrawable}. - * Note that we allow the animation to happen on the group's attributes and path's - * attributes, which requires they are uniquely named in this XML file. Groups - * and paths without animations do not need names. + * AnimatedVectorDrawable can be defined in either <a href="#ThreeXML">three separate XML files</a>, + * or <a href="#OneXML">one XML</a>. * </p> - * <li>Here is a simple VectorDrawable in this vectordrawable.xml file. + * <a name="ThreeXML"></a> + * <h3>Define an AnimatedVectorDrawable in three separate XML files</h3> + * <ul> + * <a name="VDExample"></a> + * <li><h4>XML for the VectorDrawable containing properties to be animated</h4> + * <p> + * Animations can be performed on both group and path attributes, which requires groups and paths to + * have unique names in the same VectorDrawable. Groups and paths without animations do not need to + * be named. + * </p> + * Below is an example of a VectorDrawable defined in vectordrawable.xml. This VectorDrawable is + * referred to by its file name (not including file suffix) in the + * <a href="AVDExample">AnimatedVectorDrawable XML example</a>. * <pre> * <vector xmlns:android="http://schemas.android.com/apk/res/android" * android:height="64dp" @@ -96,17 +113,20 @@ import java.util.ArrayList; * </group> * </vector> * </pre></li> + * + * <a name="AVDExample"></a> + * <li><h4>XML for AnimatedVectorDrawable</h4> * <p> - * Second is the AnimatedVectorDrawable's XML file, which defines the target - * VectorDrawable, the target paths and groups to animate, the properties of the - * path and group to animate and the animations defined as the ObjectAnimators - * or AnimatorSets. + * An AnimatedVectorDrawable element has a VectorDrawable attribute, and one or more target + * element(s). The target elements can be the path or group to be animated. Each target element + * contains a name attribute that references a property (of a path or a group) to animate, and an + * animation attribute that points to an ObjectAnimator or an AnimatorSet. * </p> - * <li>Here is a simple AnimatedVectorDrawable defined in this avd.xml file. - * Note how we use the names to refer to the groups and paths in the vectordrawable.xml. + * The following code sample defines an AnimatedVectorDrawable. Note that the names refer to the + * groups and paths in the <a href="#VDExample">VectorDrawable XML above</a>. * <pre> * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - * android:drawable="@drawable/vectordrawable" > + * android:drawable="@drawable/vectordrawable" > * <target * android:name="rotationGroup" * android:animation="@anim/rotation" /> @@ -114,39 +134,43 @@ import java.util.ArrayList; * android:name="v" * android:animation="@anim/path_morph" /> * </animated-vector> - * </pre></li> + * </pre> + * </li> + * + * <li><h4>XML for Animations defined using ObjectAnimator or AnimatorSet</h4> * <p> - * Last is the Animator XML file, which is the same as a normal ObjectAnimator - * or AnimatorSet. - * To complete this example, here are the 2 animator files used in avd.xml: - * rotation.xml and path_morph.xml. + * From the previous <a href="#AVDExample">example of AnimatedVectorDrawable</a>, two animations + * were used: rotation.xml and path_morph.xml. * </p> - * <li>Here is the rotation.xml, which will rotate the target group for 360 degrees. + * rotation.xml rotates the target group from 0 degree to 360 degrees over 6000ms: * <pre> * <objectAnimator * android:duration="6000" * android:propertyName="rotation" * android:valueFrom="0" * android:valueTo="360" /> - * </pre></li> - * <li>Here is the path_morph.xml, which will morph the path from one shape to - * the other. Note that the paths must be compatible for morphing. - * In more details, the paths should have exact same length of commands , and - * exact same length of parameters for each commands. - * Note that the path strings are better stored in strings.xml for reusing. + * </pre> + * + * path_morph.xml morphs the path from one shape into the other. Note that the paths must be + * compatible for morphing. Specifically, the paths must have the same commands, in the same order, + * and must have the same number of parameters for each command. It is recommended to store path + * strings as string resources for reuse. * <pre> * <set xmlns:android="http://schemas.android.com/apk/res/android"> * <objectAnimator * android:duration="3000" * android:propertyName="pathData" - * android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" + * android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" * android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z" * android:valueType="pathType"/> * </set> - * </pre></li> + * </pre> + * </ul> + * <a name="OneXML"></a> + * <h3>Define an AnimatedVectorDrawable all in one XML file</h3> * <p> - * Since AAPT tool is now supporting a new format which can bundle several related XML files into - * one, we can merge the previous example into one XML file, like this: + * Since the AAPT tool supports a new format that bundles several related XML files together, we can + * merge the XML files from the previous examples into one XML file: * </p> * <pre> * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" > @@ -185,7 +209,7 @@ import java.util.ArrayList; * <objectAnimator * android:duration="3000" * android:propertyName="pathData" - * android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" + * android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" * android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z" * android:valueType="pathType"/> * </set> @@ -286,6 +310,17 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { return super.getChangingConfigurations() | mAnimatedVectorState.getChangingConfigurations(); } + /** + * Draws the AnimatedVectorDrawable into the given canvas. + * <p> + * <strong>Note:</strong> Calling this method with a software canvas when the + * AnimatedVectorDrawable is being animated on RenderThread (for API 25 and later) may yield + * outdated result, as the UI thread is not guaranteed to be in sync with RenderThread on + * VectorDrawable's property changes during RenderThread animations. + * </p> + * + * @param canvas The canvas to draw into + */ @Override public void draw(Canvas canvas) { if (!canvas.isHardwareAccelerated() && mAnimatorSet instanceof VectorDrawableAnimatorRT) { @@ -321,9 +356,9 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } /** - * AnimatedVectorDrawable is running on render thread now. Therefore, if the root alpha is being - * animated, then the root alpha value we get from this call could be out of sync with alpha - * value used in the render thread. Otherwise, the root alpha should be always the same value. + * For API 25 and later, AnimatedVectorDrawable runs on RenderThread. Therefore, when the + * root alpha is being animated, this getter does not guarantee to return an up-to-date alpha + * value. * * @return the containing vector drawable's root alpha value. */ @@ -1495,7 +1530,6 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } else { addPendingAction(START_ANIMATION); } - } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 0775f15289b9..61c1fe2d399f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -377,17 +377,18 @@ public class AccessPoint implements Comparable<AccessPoint> { } public String getSavedNetworkSummary() { - if (mConfig != null) { + WifiConfiguration config = mConfig; + if (config != null) { PackageManager pm = mContext.getPackageManager(); String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID); - int userId = UserHandle.getUserId(mConfig.creatorUid); + int userId = UserHandle.getUserId(config.creatorUid); ApplicationInfo appInfo = null; - if (mConfig.creatorName != null && mConfig.creatorName.equals(systemName)) { + if (config.creatorName != null && config.creatorName.equals(systemName)) { appInfo = mContext.getApplicationInfo(); } else { try { IPackageManager ipm = AppGlobals.getPackageManager(); - appInfo = ipm.getApplicationInfo(mConfig.creatorName, 0 /* flags */, userId); + appInfo = ipm.getApplicationInfo(config.creatorName, 0 /* flags */, userId); } catch (RemoteException rex) { } } @@ -402,29 +403,33 @@ public class AccessPoint implements Comparable<AccessPoint> { } public String getSummary() { - return getSettingsSummary(); + return getSettingsSummary(mConfig); } public String getSettingsSummary() { + return getSettingsSummary(mConfig); + } + + private String getSettingsSummary(WifiConfiguration config) { // Update to new summary StringBuilder summary = new StringBuilder(); - if (isActive() && mConfig != null && mConfig.isPasspoint()) { + if (isActive() && config != null && config.isPasspoint()) { // This is the active connection on passpoint summary.append(getSummary(mContext, getDetailedState(), - false, mConfig.providerFriendlyName)); + false, config.providerFriendlyName)); } else if (isActive()) { // This is the active connection on non-passpoint network summary.append(getSummary(mContext, getDetailedState(), mInfo != null && mInfo.isEphemeral())); - } else if (mConfig != null && mConfig.isPasspoint()) { + } else if (config != null && config.isPasspoint()) { String format = mContext.getString(R.string.available_via_passpoint); - summary.append(String.format(format, mConfig.providerFriendlyName)); - } else if (mConfig != null && mConfig.hasNoInternetAccess()) { + summary.append(String.format(format, config.providerFriendlyName)); + } else if (config != null && config.hasNoInternetAccess()) { summary.append(mContext.getString(R.string.wifi_no_internet)); - } else if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) { + } else if (config != null && !config.getNetworkSelectionStatus().isNetworkEnabled()) { WifiConfiguration.NetworkSelectionStatus networkStatus = - mConfig.getNetworkSelectionStatus(); + config.getNetworkSelectionStatus(); switch (networkStatus.getNetworkSelectionDisableReason()) { case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE: summary.append(mContext.getString(R.string.wifi_disabled_password_failure)); @@ -440,7 +445,7 @@ public class AccessPoint implements Comparable<AccessPoint> { } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range summary.append(mContext.getString(R.string.wifi_not_in_range)); } else { // In range, not disabled. - if (mConfig != null) { // Is saved network + if (config != null) { // Is saved network summary.append(mContext.getString(R.string.wifi_remembered)); } } @@ -452,11 +457,11 @@ public class AccessPoint implements Comparable<AccessPoint> { summary.append(" f=" + Integer.toString(mInfo.getFrequency())); } summary.append(" " + getVisibilityStatus()); - if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) { - summary.append(" (" + mConfig.getNetworkSelectionStatus().getNetworkStatusString()); - if (mConfig.getNetworkSelectionStatus().getDisableTime() > 0) { + if (config != null && !config.getNetworkSelectionStatus().isNetworkEnabled()) { + summary.append(" (" + config.getNetworkSelectionStatus().getNetworkStatusString()); + if (config.getNetworkSelectionStatus().getDisableTime() > 0) { long now = System.currentTimeMillis(); - long diff = (now - mConfig.getNetworkSelectionStatus().getDisableTime()) / 1000; + long diff = (now - config.getNetworkSelectionStatus().getDisableTime()) / 1000; long sec = diff%60; //seconds long min = (diff/60)%60; //minutes long hour = (min/60)%60; //hours @@ -468,9 +473,9 @@ public class AccessPoint implements Comparable<AccessPoint> { summary.append(")"); } - if (mConfig != null) { + if (config != null) { WifiConfiguration.NetworkSelectionStatus networkStatus = - mConfig.getNetworkSelectionStatus(); + config.getNetworkSelectionStatus(); for (int index = WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE; index < WifiConfiguration.NetworkSelectionStatus .NETWORK_SELECTION_DISABLED_MAX; index++) { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 4111d21e6112..0100bff675bb 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3005,6 +3005,12 @@ public class ConnectivityService extends IConnectivityManager.Stub case EVENT_CONFIGURE_NETWORK_AVOID_BAD_WIFI: { if (updateAvoidBadWifi()) { rematchAllNetworksAndRequests(null, 0); + for (NetworkAgentInfo nai: mNetworkAgentInfos.values()) { + if (nai.networkCapabilities.hasTransport( + NetworkCapabilities.TRANSPORT_WIFI)) { + sendUpdatedScoreToFactories(nai); + } + } } break; } diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java index dc8eaf640537..f0301155a322 100644 --- a/telecomm/java/android/telecom/RemoteConnection.java +++ b/telecomm/java/android/telecom/RemoteConnection.java @@ -638,7 +638,12 @@ public final class RemoteConnection { mConnectionCapabilities = connection.getConnectionCapabilities(); mConnectionProperties = connection.getConnectionProperties(); mVideoState = connection.getVideoState(); - mVideoProvider = new RemoteConnection.VideoProvider(connection.getVideoProvider()); + IVideoProvider videoProvider = connection.getVideoProvider(); + if (videoProvider != null) { + mVideoProvider = new RemoteConnection.VideoProvider(videoProvider); + } else { + mVideoProvider = null; + } mIsVoipAudioMode = connection.getIsVoipAudioMode(); mStatusHints = connection.getStatusHints(); mAddress = connection.getHandle(); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index bdc9c45840b8..411d881c2dde 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -709,6 +709,13 @@ public class CarrierConfigManager { "read_only_apn_types_string_array"; /** + * APN fields that user is not allowed to modify + * @hide + */ + public static final String KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY = + "read_only_apn_fields_string_array"; + + /** * Boolean indicating if intent for emergency call state changes should be broadcast * @hide */ @@ -1076,6 +1083,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_CSP_ENABLED_BOOL, false); sDefaults.putBoolean(KEY_ALLOW_ADDING_APNS_BOOL, true); sDefaults.putStringArray(KEY_READ_ONLY_APN_TYPES_STRING_ARRAY, null); + sDefaults.putStringArray(KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY, null); sDefaults.putBoolean(KEY_BROADCAST_EMERGENCY_CALL_STATE_CHANGES_BOOL, false); sDefaults.putBoolean(KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_SEVERE_WHEN_EXTREME_DISABLED_BOOL, true); |