Add shims for ConnectivityManager
requestBackgroundNetwork and registerSystemDefaultNetworkCallback
are not available before API31 so ConnectivityManageShim is used
as a wrapper that can hold a reference to it in common code.
Bug: 167645754
Test: m NetworkStackApiCurrentLib NetworkStackApiStableLib
Test: atest NetworkStackTests NetworkStackNextTests
Test: local verify the usage in ConnectivityManagerTests
Change-Id: I1f7ecd6c6005631951f514d60885a5d453c3f2d9
diff --git a/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java
new file mode 100644
index 0000000..e504495
--- /dev/null
+++ b/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.apishim.api29;
+
+import android.content.Context;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkRequest;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.networkstack.apishim.common.ConnectivityManagerShim;
+import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
+
+/**
+ * Implementation of {@link ConnectivityManagerShim} for API 29.
+ */
+public class ConnectivityManagerShimImpl implements ConnectivityManagerShim {
+ protected ConnectivityManagerShimImpl(Context context) {}
+
+ /**
+ * Get a new instance of {@link ConnectivityManagerShim}.
+ */
+ public static ConnectivityManagerShim newInstance(Context context) {
+ return new ConnectivityManagerShimImpl(context);
+ }
+ /**
+ * See android.net.ConnectivityManager#requestBackgroundNetwork
+ * @throws UnsupportedApiLevelException if API is not available in this API level.
+ */
+ @Override
+ public void requestBackgroundNetwork(@NonNull NetworkRequest request,
+ @Nullable Handler handler, @NonNull NetworkCallback networkCallback)
+ throws UnsupportedApiLevelException {
+ // Not supported for API 29.
+ throw new UnsupportedApiLevelException("Not supported in API 29.");
+ }
+
+ /**
+ * See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback
+ * @throws UnsupportedApiLevelException if API is not available in this API level.
+ */
+ @Override
+ public void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
+ @NonNull Handler handler) throws UnsupportedApiLevelException {
+ // Not supported for API 29.
+ throw new UnsupportedApiLevelException("Not supported in API 29.");
+ }
+}
diff --git a/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java b/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java
new file mode 100644
index 0000000..ac62522
--- /dev/null
+++ b/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.apishim.api30;
+
+import android.content.Context;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkRequest;
+import android.os.Build;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.networkstack.apishim.common.ConnectivityManagerShim;
+import com.android.networkstack.apishim.common.ShimUtils;
+import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
+
+/**
+ * Implementation of {@link ConnectivityManagerShim} for API 30.
+ */
+public class ConnectivityManagerShimImpl
+ extends com.android.networkstack.apishim.api29.ConnectivityManagerShimImpl {
+ protected ConnectivityManagerShimImpl(Context context) {
+ super(context);
+ }
+
+ /**
+ * Get a new instance of {@link ConnectivityManagerShim}.
+ */
+ public static ConnectivityManagerShim newInstance(Context context) {
+ if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) {
+ return com.android.networkstack.apishim.api29.ConnectivityManagerShimImpl
+ .newInstance(context);
+ }
+ return new ConnectivityManagerShimImpl(context);
+ }
+
+ /**
+ * See android.net.ConnectivityManager#requestBackgroundNetwork
+ * @throws UnsupportedApiLevelException if API is not available in this API level.
+ */
+ @Override
+ public void requestBackgroundNetwork(@NonNull NetworkRequest request,
+ @Nullable Handler handler, @NonNull NetworkCallback networkCallback)
+ throws UnsupportedApiLevelException {
+ // Not supported for API 30.
+ throw new UnsupportedApiLevelException("Not supported in API 30.");
+ }
+
+ /**
+ * See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback
+ * @throws UnsupportedApiLevelException if API is not available in this API level.
+ */
+ @Override
+ public void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
+ @NonNull Handler handler) throws UnsupportedApiLevelException {
+ // Not supported for API 30.
+ throw new UnsupportedApiLevelException("Not supported in API 30.");
+ }
+}
diff --git a/apishim/31/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java b/apishim/31/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java
new file mode 100644
index 0000000..0c3fa3e
--- /dev/null
+++ b/apishim/31/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.apishim;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkRequest;
+import android.os.Build;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.networkstack.apishim.common.ConnectivityManagerShim;
+import com.android.networkstack.apishim.common.ShimUtils;
+
+/**
+ * Implementation of {@link ConnectivityManagerShim} for API 31.
+ */
+public class ConnectivityManagerShimImpl
+ extends com.android.networkstack.apishim.api30.ConnectivityManagerShimImpl {
+ private final ConnectivityManager mCm;
+
+ protected ConnectivityManagerShimImpl(Context context) {
+ super(context);
+ mCm = context.getSystemService(ConnectivityManager.class);
+ }
+
+ /**
+ * Get a new instance of {@link ConnectivityManagerShim}.
+ */
+ public static ConnectivityManagerShim newInstance(Context context) {
+ if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.R)) {
+ return com.android.networkstack.apishim.api30.ConnectivityManagerShimImpl
+ .newInstance(context);
+ }
+ return new ConnectivityManagerShimImpl(context);
+ }
+
+ /**
+ * See android.net.ConnectivityManager#requestBackgroundNetwork
+ */
+ @Override
+ public void requestBackgroundNetwork(@NonNull NetworkRequest request,
+ @Nullable Handler handler, @NonNull NetworkCallback networkCallback) {
+ mCm.requestBackgroundNetwork(request, handler, networkCallback);
+ }
+
+ /**
+ * See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback
+ */
+ @Override
+ public void registerSystemDefaultNetworkCallback(
+ @NonNull NetworkCallback networkCallback, @NonNull Handler handler) {
+ mCm.registerSystemDefaultNetworkCallback(networkCallback, handler);
+ }
+}
diff --git a/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java b/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java
new file mode 100644
index 0000000..2d60d97
--- /dev/null
+++ b/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.apishim.common;
+
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkRequest;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+
+/**
+ * Interface used to access API methods in {@link android.net.ConnectivityManager}, with
+ * appropriate fallbacks if the methods are not yet part of the released API.
+ *
+ * <p>This interface makes it easier for callers to use ConnectivityManagerShimImpl, as it's more
+ * obvious what methods must be implemented on each API level, and it abstracts from callers the
+ * need to reference classes that have different implementations (which also does not work well
+ * with IDEs).
+ */
+public interface ConnectivityManagerShim {
+ /** See android.net.ConnectivityManager#requestBackgroundNetwork */
+ void requestBackgroundNetwork(@NonNull NetworkRequest request,
+ @Nullable Handler handler, @NonNull NetworkCallback networkCallback)
+ throws UnsupportedApiLevelException;
+
+ /** See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback */
+ void registerSystemDefaultNetworkCallback(
+ @NonNull NetworkCallback networkCallback, @NonNull Handler handler)
+ throws UnsupportedApiLevelException;
+}