Merge "[SM10] Adopt helper class to monitor RAT type change per sub" into rvc-dev am: cdd7c94ec0 am: 5f8004030c
Change-Id: I883b3b8d699bda1b640992b621b547048f057807
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.NetworkStatsHistory.FIELD_ALL;
|
||||||
import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
|
import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
|
||||||
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
|
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.KB_IN_BYTES;
|
||||||
import static android.net.TrafficStats.MB_IN_BYTES;
|
import static android.net.TrafficStats.MB_IN_BYTES;
|
||||||
import static android.os.Trace.TRACE_TAG_NETWORK;
|
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_DELETE_AGE;
|
||||||
import static android.provider.Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES;
|
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.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.DAY_IN_MILLIS;
|
||||||
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
|
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
|
||||||
import static android.text.format.DateUtils.MINUTE_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.NetworkInterfaceProto;
|
||||||
import android.service.NetworkStatsServiceDumpProto;
|
import android.service.NetworkStatsServiceDumpProto;
|
||||||
import android.telephony.PhoneStateListener;
|
import android.telephony.PhoneStateListener;
|
||||||
import android.telephony.ServiceState;
|
|
||||||
import android.telephony.SubscriptionPlan;
|
import android.telephony.SubscriptionPlan;
|
||||||
import android.telephony.TelephonyManager;
|
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
@@ -206,7 +200,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
private final NetworkStatsFactory mStatsFactory;
|
private final NetworkStatsFactory mStatsFactory;
|
||||||
private final AlarmManager mAlarmManager;
|
private final AlarmManager mAlarmManager;
|
||||||
private final Clock mClock;
|
private final Clock mClock;
|
||||||
private final TelephonyManager mTeleManager;
|
|
||||||
private final NetworkStatsSettings mSettings;
|
private final NetworkStatsSettings mSettings;
|
||||||
private final NetworkStatsObservers mStatsObservers;
|
private final NetworkStatsObservers mStatsObservers;
|
||||||
|
|
||||||
@@ -352,6 +345,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final Dependencies mDeps;
|
private final Dependencies mDeps;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final NetworkStatsSubscriptionsMonitor mNetworkStatsSubscriptionsMonitor;
|
||||||
|
|
||||||
private static @NonNull File getDefaultSystemDir() {
|
private static @NonNull File getDefaultSystemDir() {
|
||||||
return new File(Environment.getDataDirectory(), "system");
|
return new File(Environment.getDataDirectory(), "system");
|
||||||
}
|
}
|
||||||
@@ -401,8 +397,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
PowerManager.WakeLock wakeLock =
|
PowerManager.WakeLock wakeLock =
|
||||||
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||||
|
|
||||||
NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
|
final NetworkStatsService service = new NetworkStatsService(context, networkManager,
|
||||||
wakeLock, getDefaultClock(), context.getSystemService(TelephonyManager.class),
|
alarmManager, wakeLock, getDefaultClock(),
|
||||||
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(),
|
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(),
|
||||||
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
||||||
new Dependencies());
|
new Dependencies());
|
||||||
@@ -416,16 +412,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
NetworkStatsService(Context context, INetworkManagementService networkManager,
|
NetworkStatsService(Context context, INetworkManagementService networkManager,
|
||||||
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
|
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
|
||||||
TelephonyManager teleManager, NetworkStatsSettings settings,
|
NetworkStatsSettings settings, NetworkStatsFactory factory,
|
||||||
NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
|
NetworkStatsObservers statsObservers, File systemDir, File baseDir,
|
||||||
File baseDir, @NonNull Dependencies deps) {
|
@NonNull Dependencies deps) {
|
||||||
mContext = Objects.requireNonNull(context, "missing Context");
|
mContext = Objects.requireNonNull(context, "missing Context");
|
||||||
mNetworkManager = Objects.requireNonNull(networkManager,
|
mNetworkManager = Objects.requireNonNull(networkManager,
|
||||||
"missing INetworkManagementService");
|
"missing INetworkManagementService");
|
||||||
mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
|
mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
|
||||||
mClock = Objects.requireNonNull(clock, "missing Clock");
|
mClock = Objects.requireNonNull(clock, "missing Clock");
|
||||||
mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
|
mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
|
||||||
mTeleManager = Objects.requireNonNull(teleManager, "missing TelephonyManager");
|
|
||||||
mWakeLock = Objects.requireNonNull(wakeLock, "missing WakeLock");
|
mWakeLock = Objects.requireNonNull(wakeLock, "missing WakeLock");
|
||||||
mStatsFactory = Objects.requireNonNull(factory, "missing factory");
|
mStatsFactory = Objects.requireNonNull(factory, "missing factory");
|
||||||
mStatsObservers = Objects.requireNonNull(statsObservers, "missing NetworkStatsObservers");
|
mStatsObservers = Objects.requireNonNull(statsObservers, "missing NetworkStatsObservers");
|
||||||
@@ -437,7 +432,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
final HandlerThread handlerThread = mDeps.makeHandlerThread();
|
final HandlerThread handlerThread = mDeps.makeHandlerThread();
|
||||||
handlerThread.start();
|
handlerThread.start();
|
||||||
mHandler = new NetworkStatsHandler(handlerThread.getLooper());
|
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() {
|
public HandlerThread makeHandlerThread() {
|
||||||
return new HandlerThread(TAG);
|
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() {
|
private void registerLocalService() {
|
||||||
@@ -517,11 +526,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime,
|
mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime,
|
||||||
mSettings.getPollInterval(), pollIntent);
|
mSettings.getPollInterval(), pollIntent);
|
||||||
|
|
||||||
// TODO: 1. listen to changes from all subscriptions.
|
// TODO: listen to settings changed to support dynamically enable/disable.
|
||||||
// 2. listen to settings changed to support dynamically enable/disable.
|
|
||||||
// watch for networkType changes
|
// watch for networkType changes
|
||||||
if (!mSettings.getCombineSubtypeEnabled()) {
|
if (!mSettings.getCombineSubtypeEnabled()) {
|
||||||
mTeleManager.listen(mPhoneListener, LISTEN_SERVICE_STATE);
|
mNetworkStatsSubscriptionsMonitor.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
registerGlobalAlert();
|
registerGlobalAlert();
|
||||||
@@ -544,7 +552,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
mContext.unregisterReceiver(mUserReceiver);
|
mContext.unregisterReceiver(mUserReceiver);
|
||||||
mContext.unregisterReceiver(mShutdownReceiver);
|
mContext.unregisterReceiver(mShutdownReceiver);
|
||||||
|
|
||||||
mTeleManager.listen(mPhoneListener, LISTEN_NONE);
|
if (!mSettings.getCombineSubtypeEnabled()) {
|
||||||
|
mNetworkStatsSubscriptionsMonitor.stop();
|
||||||
|
}
|
||||||
|
|
||||||
final long currentTime = mClock.millis();
|
final long currentTime = mClock.millis();
|
||||||
|
|
||||||
@@ -1197,35 +1207,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receiver that watches for {@link TelephonyManager} changes, such as
|
* Handle collapsed RAT type changed event.
|
||||||
* transitioning between Radio Access Technology(RAT) types.
|
|
||||||
*/
|
*/
|
||||||
@NonNull
|
@VisibleForTesting
|
||||||
private final NetworkTypeListener mPhoneListener;
|
public void handleOnCollapsedRatTypeChanged() {
|
||||||
|
// Protect service from frequently updating. Remove pending messages if any.
|
||||||
class NetworkTypeListener extends PhoneStateListener {
|
mHandler.removeMessages(MSG_UPDATE_IFACES);
|
||||||
private volatile int mLastCollapsedRatType = NETWORK_TYPE_UNKNOWN;
|
mHandler.sendMessageDelayed(
|
||||||
|
mHandler.obtainMessage(MSG_UPDATE_IFACES), mSettings.getPollDelay());
|
||||||
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);
|
|
||||||
}
|
|
||||||
// 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(
|
private void updateIfaces(
|
||||||
@@ -1352,8 +1341,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: return different subType for different subscriptions.
|
return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.subscriberId);
|
||||||
return mPhoneListener.mLastCollapsedRatType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <K> NetworkIdentitySet findOrCreateNetworkIdentitySet(
|
private static <K> NetworkIdentitySet findOrCreateNetworkIdentitySet(
|
||||||
|
|||||||
Reference in New Issue
Block a user