diff options
7 files changed, 78 insertions, 13 deletions
diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java index 647514486750..a20191cab774 100644 --- a/core/java/android/net/Ikev2VpnProfile.java +++ b/core/java/android/net/Ikev2VpnProfile.java @@ -1108,6 +1108,11 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { /** * Sets the enabled state of the automatic NAT-T keepalive timers * + * Note that if this builder was constructed with a {@link IkeTunnelConnectionParams}, + * but this is called with {@code true}, the framework will automatically choose the + * appropriate keepalive timer and ignore the settings in the session params embedded + * in the connection params. + * * @param isEnabled {@code true} to enable automatic keepalive timers, based on internal * platform signals. Defaults to {@code false}. * @return this {@link Builder} object to facilitate chaining of method calls diff --git a/core/jni/android_media_MicrophoneInfo.cpp b/core/jni/android_media_MicrophoneInfo.cpp index 65e30d8b1ea3..18f81254af7d 100644 --- a/core/jni/android_media_MicrophoneInfo.cpp +++ b/core/jni/android_media_MicrophoneInfo.cpp @@ -92,6 +92,7 @@ jint convertMicrophoneInfoFromNative(JNIEnv *env, jobject *jMicrophoneInfo, env->DeleteLocalRef(jFrequencyResponse); } // Create a list of Pair for channel mapping. + jChannelMappings = env->NewObject(gArrayListClass, gArrayListCstor); const auto &channelMapping = micInfo.channel_mapping; for (size_t i = 0; i < std::size(channelMapping); i++) { int channelMappingType = channelMapping[i]; diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java index 27db41cb9f4e..171349a26569 100644 --- a/media/java/android/media/RingtoneManager.java +++ b/media/java/android/media/RingtoneManager.java @@ -841,7 +841,7 @@ public class RingtoneManager { if (ringtoneUri != null) { final Uri cacheUri = getCacheForType(type, context.getUserId()); try (InputStream in = openRingtone(context, ringtoneUri); - OutputStream out = resolver.openOutputStream(cacheUri)) { + OutputStream out = resolver.openOutputStream(cacheUri, "wt")) { FileUtils.copy(in, out); } catch (IOException e) { Log.w(TAG, "Failed to cache ringtone: " + e); diff --git a/packages/SettingsLib/res/values/styles.xml b/packages/SettingsLib/res/values/styles.xml index 5237b4fa1c3d..172aff76d481 100644 --- a/packages/SettingsLib/res/values/styles.xml +++ b/packages/SettingsLib/res/values/styles.xml @@ -14,7 +14,7 @@ ~ limitations under the License --> -<resources> +<resources xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <style name="TextAppearanceSmall"> <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> </style> @@ -73,7 +73,7 @@ </style> <style name="TextAppearanceBroadcastDialogButton" parent="@android:TextAppearance.DeviceDefault.Headline"> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?androidprv:attr/textColorOnAccent</item> <item name="android:textSize">@dimen/broadcast_dialog_btn_text_size</item> </style> diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index c15e419c073c..ab2c002c2b24 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -25,6 +25,8 @@ import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.RouteInfo.RTN_THROW; import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.net.VpnManager.NOTIFICATION_CHANNEL_VPN; +import static android.net.ipsec.ike.IkeSessionParams.ESP_ENCAP_TYPE_AUTO; +import static android.net.ipsec.ike.IkeSessionParams.ESP_IP_VERSION_AUTO; import static android.os.PowerWhitelistManager.REASON_VPN; import static android.os.UserHandle.PER_USER_RANGE; @@ -251,6 +253,14 @@ public class Vpn { */ private static final int STARTING_TOKEN = -1; + // TODO : read this from carrier config instead of a constant + @VisibleForTesting + public static final int AUTOMATIC_KEEPALIVE_DELAY_SECONDS = 30; + + // Default keepalive timeout for carrier config is 5 minutes. Mimic this. + @VisibleForTesting + static final int DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT = 5 * 60; + // TODO: create separate trackers for each unique VPN to support // automated reconnection @@ -3071,6 +3081,7 @@ public class Vpn { prepareStatusIntent(); } agentConnect(this::onValidationStatus); + mSession.setUnderpinnedNetwork(mNetworkAgent.getNetwork()); return; // Link properties are already sent. } else { // Underlying networks also set in agentConnect() @@ -3179,6 +3190,7 @@ public class Vpn { if (!removedAddrs.isEmpty()) { startNewNetworkAgent( mNetworkAgent, "MTU too low for IPv6; restarting network agent"); + mSession.setUnderpinnedNetwork(mNetworkAgent.getNetwork()); for (LinkAddress removed : removedAddrs) { mTunnelIface.removeAddress( @@ -3251,14 +3263,22 @@ public class Vpn { private IkeSessionParams getIkeSessionParams(@NonNull Network underlyingNetwork) { final IkeTunnelConnectionParams ikeTunConnParams = mProfile.getIkeTunnelConnectionParams(); + final IkeSessionParams.Builder builder; if (ikeTunConnParams != null) { - final IkeSessionParams.Builder builder = - new IkeSessionParams.Builder(ikeTunConnParams.getIkeSessionParams()) - .setNetwork(underlyingNetwork); - return builder.build(); + builder = new IkeSessionParams.Builder(ikeTunConnParams.getIkeSessionParams()) + .setNetwork(underlyingNetwork); } else { - return VpnIkev2Utils.buildIkeSessionParams(mContext, mProfile, underlyingNetwork); + builder = VpnIkev2Utils.makeIkeSessionParamsBuilder(mContext, mProfile, + underlyingNetwork); } + if (mProfile.isAutomaticNattKeepaliveTimerEnabled()) { + builder.setNattKeepAliveDelaySeconds(guessNattKeepaliveTimerForNetwork()); + } + if (mProfile.isAutomaticIpVersionSelectionEnabled()) { + builder.setIpVersion(guessEspIpVersionForNetwork()); + builder.setEncapType(guessEspEncapTypeForNetwork()); + } + return builder.build(); } @NonNull @@ -3322,6 +3342,23 @@ public class Vpn { startIkeSession(underlyingNetwork); } + private int guessEspIpVersionForNetwork() { + // TODO : guess the IP version based on carrier if auto IP version selection is enabled + return ESP_IP_VERSION_AUTO; + } + + private int guessEspEncapTypeForNetwork() { + // TODO : guess the ESP encap type based on carrier if auto IP version selection is + // enabled + return ESP_ENCAP_TYPE_AUTO; + } + + private int guessNattKeepaliveTimerForNetwork() { + // TODO : guess the keepalive delay based on carrier if auto keepalive timer is + // enabled + return AUTOMATIC_KEEPALIVE_DELAY_SECONDS; + } + boolean maybeMigrateIkeSession(@NonNull Network underlyingNetwork) { if (mSession == null || !mMobikeEnabled) return false; @@ -3331,7 +3368,20 @@ public class Vpn { + mCurrentToken + " to network " + underlyingNetwork); - mSession.setNetwork(underlyingNetwork); + final int ipVersion = mProfile.isAutomaticIpVersionSelectionEnabled() + ? guessEspIpVersionForNetwork() : ESP_IP_VERSION_AUTO; + final int encapType = mProfile.isAutomaticIpVersionSelectionEnabled() + ? guessEspEncapTypeForNetwork() : ESP_ENCAP_TYPE_AUTO; + final int keepaliveDelaySeconds; + if (mProfile.isAutomaticNattKeepaliveTimerEnabled()) { + keepaliveDelaySeconds = guessNattKeepaliveTimerForNetwork(); + } else if (mProfile.getIkeTunnelConnectionParams() != null) { + keepaliveDelaySeconds = mProfile.getIkeTunnelConnectionParams() + .getIkeSessionParams().getNattKeepAliveDelaySeconds(); + } else { + keepaliveDelaySeconds = DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT; + } + mSession.setNetwork(underlyingNetwork, ipVersion, encapType, keepaliveDelaySeconds); return true; } @@ -4661,8 +4711,14 @@ public class Vpn { } /** Update the underlying network of the IKE Session */ - public void setNetwork(@NonNull Network network) { - mImpl.setNetwork(network); + public void setNetwork(@NonNull Network network, int ipVersion, int encapType, + int keepaliveDelaySeconds) { + mImpl.setNetwork(network, ipVersion, encapType, keepaliveDelaySeconds); + } + + /** Set the underpinned network */ + public void setUnderpinnedNetwork(@NonNull Network underpinnedNetwork) { + mImpl.setUnderpinnedNetwork(underpinnedNetwork); } /** Forcibly terminate the IKE Session */ diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java index 857c86de57ca..a48c9fcd4181 100644 --- a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java +++ b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java @@ -99,7 +99,7 @@ import java.util.concurrent.Executor; public class VpnIkev2Utils { private static final String TAG = VpnIkev2Utils.class.getSimpleName(); - static IkeSessionParams buildIkeSessionParams( + static IkeSessionParams.Builder makeIkeSessionParamsBuilder( @NonNull Context context, @NonNull Ikev2VpnProfile profile, @NonNull Network network) { final IkeIdentification localId = parseIkeIdentification(profile.getUserIdentity()); final IkeIdentification remoteId = parseIkeIdentification(profile.getServerAddr()); @@ -117,7 +117,7 @@ public class VpnIkev2Utils { ikeOptionsBuilder.addSaProposal(ikeProposal); } - return ikeOptionsBuilder.build(); + return ikeOptionsBuilder; } static ChildSessionParams buildChildSessionParams(List<String> allowedAlgorithms) { diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java index 90ddb6ffb34a..d2a6bf288be4 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java +++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java @@ -31,6 +31,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -299,6 +300,8 @@ public final class BackgroundDexOptServiceIntegrationTests { // Test that background dexopt under low storage conditions downgrades unused packages. @Test + @Ignore("b/251438180: This test has been failing for a long time; temporarily disable it while" + + " we investigate this issue.") public void testBackgroundDexOptDowngradeSuccessful() throws IOException { // Should be more than DOWNGRADE_AFTER_DAYS. long deltaDays = DOWNGRADE_AFTER_DAYS + 1; |