1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.telephony.metrics; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.content.Context; 22 import android.net.ConnectivityManager; 23 import android.net.ConnectivityManager.NetworkCallback; 24 import android.net.Network; 25 import android.net.NetworkCapabilities; 26 import android.os.Handler; 27 import android.os.Looper; 28 29 import com.android.internal.telephony.flags.FeatureFlags; 30 import com.android.telephony.Rlog; 31 32 /** 33 * Monitors the system default network registration and tracks the currently available 34 * {@link Network} and its {@link NetworkCapabilities}. 35 */ 36 public class DefaultNetworkMonitor extends Handler { 37 38 private static final String TAG = DefaultNetworkMonitor.class.getSimpleName(); 39 40 @Nullable private NetworkCallback mDefaultNetworkCallback; 41 @Nullable private Network mNetwork; 42 @Nullable private NetworkCapabilities mNetworkCapabilities; 43 44 private final class DefaultNetworkCallback extends NetworkCallback { 45 @Override onAvailable(@onNull Network network)46 public void onAvailable(@NonNull Network network) { 47 mNetwork = network; 48 } 49 50 @Override onCapabilitiesChanged(@onNull Network network, @NonNull NetworkCapabilities nc)51 public void onCapabilitiesChanged(@NonNull Network network, 52 @NonNull NetworkCapabilities nc) { 53 if (network == mNetwork) { 54 mNetworkCapabilities = nc; 55 } 56 } 57 58 @Override onLost(@onNull Network network)59 public void onLost(@NonNull Network network) { 60 mNetwork = null; 61 mNetworkCapabilities = null; 62 } 63 } 64 DefaultNetworkMonitor(@onNull Context context, @NonNull FeatureFlags featureFlags)65 DefaultNetworkMonitor(@NonNull Context context, @NonNull FeatureFlags featureFlags) { 66 super(Looper.myLooper()); 67 if (featureFlags.dataCallSessionStatsCapturesCrossSimCalling()) { 68 registerSystemDefaultNetworkCallback(context); 69 } 70 } 71 registerSystemDefaultNetworkCallback(@onNull Context context)72 private void registerSystemDefaultNetworkCallback(@NonNull Context context) { 73 if (mDefaultNetworkCallback != null) { 74 return; 75 } 76 ConnectivityManager connectivityManager = 77 context.getSystemService(ConnectivityManager.class); 78 if (connectivityManager != null) { 79 mDefaultNetworkCallback = new DefaultNetworkCallback(); 80 connectivityManager.registerSystemDefaultNetworkCallback( 81 mDefaultNetworkCallback, this); 82 } else { 83 Rlog.e(TAG, "registerSystemDefaultNetworkCallback: ConnectivityManager is null!"); 84 } 85 } 86 getNetworkCapabilities()87 @Nullable public NetworkCapabilities getNetworkCapabilities() { 88 return mNetworkCapabilities; 89 } 90 } 91