[SM10] Adopt helper class to monitor RAT type change per sub
Test: atest NetworkStatsServiceTest
Bug: 146415925
Change-Id: I45c3aa9046b316c8cd0943543d620a22e4afefd1
Merged-In: I45c3aa9046b316c8cd0943543d620a22e4afefd1
(cherry picked from commit ab1eb887a6)
This commit is contained in:
@@ -46,7 +46,6 @@ import static android.net.NetworkStats.UID_ALL;
|
||||
import static android.net.NetworkStatsHistory.FIELD_ALL;
|
||||
import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
|
||||
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
|
||||
import static android.net.NetworkTemplate.getCollapsedRatType;
|
||||
import static android.net.TrafficStats.KB_IN_BYTES;
|
||||
import static android.net.TrafficStats.MB_IN_BYTES;
|
||||
import static android.os.Trace.TRACE_TAG_NETWORK;
|
||||
@@ -67,9 +66,6 @@ import static android.provider.Settings.Global.NETSTATS_UID_TAG_BUCKET_DURATION;
|
||||
import static android.provider.Settings.Global.NETSTATS_UID_TAG_DELETE_AGE;
|
||||
import static android.provider.Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES;
|
||||
import static android.provider.Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE;
|
||||
import static android.telephony.PhoneStateListener.LISTEN_NONE;
|
||||
import static android.telephony.PhoneStateListener.LISTEN_SERVICE_STATE;
|
||||
import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
|
||||
import static android.text.format.DateUtils.DAY_IN_MILLIS;
|
||||
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
|
||||
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
|
||||
@@ -133,9 +129,7 @@ import android.provider.Settings.Global;
|
||||
import android.service.NetworkInterfaceProto;
|
||||
import android.service.NetworkStatsServiceDumpProto;
|
||||
import android.telephony.PhoneStateListener;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.SubscriptionPlan;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
@@ -206,7 +200,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
private final NetworkStatsFactory mStatsFactory;
|
||||
private final AlarmManager mAlarmManager;
|
||||
private final Clock mClock;
|
||||
private final TelephonyManager mTeleManager;
|
||||
private final NetworkStatsSettings mSettings;
|
||||
private final NetworkStatsObservers mStatsObservers;
|
||||
|
||||
@@ -352,6 +345,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
@NonNull
|
||||
private final Dependencies mDeps;
|
||||
|
||||
@NonNull
|
||||
private final NetworkStatsSubscriptionsMonitor mNetworkStatsSubscriptionsMonitor;
|
||||
|
||||
private static @NonNull File getDefaultSystemDir() {
|
||||
return new File(Environment.getDataDirectory(), "system");
|
||||
}
|
||||
@@ -401,8 +397,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
PowerManager.WakeLock wakeLock =
|
||||
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||
|
||||
NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
|
||||
wakeLock, getDefaultClock(), context.getSystemService(TelephonyManager.class),
|
||||
final NetworkStatsService service = new NetworkStatsService(context, networkManager,
|
||||
alarmManager, wakeLock, getDefaultClock(),
|
||||
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(),
|
||||
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
||||
new Dependencies());
|
||||
@@ -416,16 +412,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
@VisibleForTesting
|
||||
NetworkStatsService(Context context, INetworkManagementService networkManager,
|
||||
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
|
||||
TelephonyManager teleManager, NetworkStatsSettings settings,
|
||||
NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
|
||||
File baseDir, @NonNull Dependencies deps) {
|
||||
NetworkStatsSettings settings, NetworkStatsFactory factory,
|
||||
NetworkStatsObservers statsObservers, File systemDir, File baseDir,
|
||||
@NonNull Dependencies deps) {
|
||||
mContext = Objects.requireNonNull(context, "missing Context");
|
||||
mNetworkManager = Objects.requireNonNull(networkManager,
|
||||
"missing INetworkManagementService");
|
||||
mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
|
||||
mClock = Objects.requireNonNull(clock, "missing Clock");
|
||||
mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
|
||||
mTeleManager = Objects.requireNonNull(teleManager, "missing TelephonyManager");
|
||||
mWakeLock = Objects.requireNonNull(wakeLock, "missing WakeLock");
|
||||
mStatsFactory = Objects.requireNonNull(factory, "missing factory");
|
||||
mStatsObservers = Objects.requireNonNull(statsObservers, "missing NetworkStatsObservers");
|
||||
@@ -437,7 +432,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
final HandlerThread handlerThread = mDeps.makeHandlerThread();
|
||||
handlerThread.start();
|
||||
mHandler = new NetworkStatsHandler(handlerThread.getLooper());
|
||||
mPhoneListener = new NetworkTypeListener(new HandlerExecutor(mHandler));
|
||||
mNetworkStatsSubscriptionsMonitor = deps.makeSubscriptionsMonitor(mContext,
|
||||
new HandlerExecutor(mHandler), this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -453,6 +449,19 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
public HandlerThread makeHandlerThread() {
|
||||
return new HandlerThread(TAG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a {@link NetworkStatsSubscriptionsMonitor}, can be used to monitor RAT change
|
||||
* event in NetworkStatsService.
|
||||
*/
|
||||
@NonNull
|
||||
public NetworkStatsSubscriptionsMonitor makeSubscriptionsMonitor(@NonNull Context context,
|
||||
@NonNull Executor executor, @NonNull NetworkStatsService service) {
|
||||
// TODO: Update RatType passively in NSS, instead of querying into the monitor
|
||||
// when forceUpdateIface.
|
||||
return new NetworkStatsSubscriptionsMonitor(context, executor, (subscriberId, type) ->
|
||||
service.handleOnCollapsedRatTypeChanged());
|
||||
}
|
||||
}
|
||||
|
||||
private void registerLocalService() {
|
||||
@@ -517,11 +526,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime,
|
||||
mSettings.getPollInterval(), pollIntent);
|
||||
|
||||
// TODO: 1. listen to changes from all subscriptions.
|
||||
// 2. listen to settings changed to support dynamically enable/disable.
|
||||
// TODO: listen to settings changed to support dynamically enable/disable.
|
||||
// watch for networkType changes
|
||||
if (!mSettings.getCombineSubtypeEnabled()) {
|
||||
mTeleManager.listen(mPhoneListener, LISTEN_SERVICE_STATE);
|
||||
mNetworkStatsSubscriptionsMonitor.start();
|
||||
}
|
||||
|
||||
registerGlobalAlert();
|
||||
@@ -544,7 +552,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
mContext.unregisterReceiver(mUserReceiver);
|
||||
mContext.unregisterReceiver(mShutdownReceiver);
|
||||
|
||||
mTeleManager.listen(mPhoneListener, LISTEN_NONE);
|
||||
if (!mSettings.getCombineSubtypeEnabled()) {
|
||||
mNetworkStatsSubscriptionsMonitor.stop();
|
||||
}
|
||||
|
||||
final long currentTime = mClock.millis();
|
||||
|
||||
@@ -1197,36 +1207,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
};
|
||||
|
||||
/**
|
||||
* Receiver that watches for {@link TelephonyManager} changes, such as
|
||||
* transitioning between Radio Access Technology(RAT) types.
|
||||
* Handle collapsed RAT type changed event.
|
||||
*/
|
||||
@NonNull
|
||||
private final NetworkTypeListener mPhoneListener;
|
||||
|
||||
class NetworkTypeListener extends PhoneStateListener {
|
||||
private volatile int mLastCollapsedRatType = NETWORK_TYPE_UNKNOWN;
|
||||
|
||||
NetworkTypeListener(@NonNull Executor executor) {
|
||||
super(executor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceStateChanged(@NonNull ServiceState ss) {
|
||||
final int networkType = ss.getDataNetworkType();
|
||||
final int collapsedRatType = getCollapsedRatType(networkType);
|
||||
if (collapsedRatType == mLastCollapsedRatType) return;
|
||||
|
||||
if (LOGD) {
|
||||
Log.d(TAG, "subtype changed for mobile: "
|
||||
+ mLastCollapsedRatType + " -> " + collapsedRatType);
|
||||
}
|
||||
@VisibleForTesting
|
||||
public void handleOnCollapsedRatTypeChanged() {
|
||||
// Protect service from frequently updating. Remove pending messages if any.
|
||||
mHandler.removeMessages(MSG_UPDATE_IFACES);
|
||||
mLastCollapsedRatType = collapsedRatType;
|
||||
mHandler.sendMessageDelayed(
|
||||
mHandler.obtainMessage(MSG_UPDATE_IFACES), mSettings.getPollDelay());
|
||||
}
|
||||
}
|
||||
|
||||
private void updateIfaces(
|
||||
Network[] defaultNetworks,
|
||||
@@ -1352,8 +1341,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO: return different subType for different subscriptions.
|
||||
return mPhoneListener.mLastCollapsedRatType;
|
||||
return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.subscriberId);
|
||||
}
|
||||
|
||||
private static <K> NetworkIdentitySet findOrCreateNetworkIdentitySet(
|
||||
|
||||
Reference in New Issue
Block a user