Merge NetworkStatsService handler changes.

=====
Remove the need of accessing handler in NSS unit test

Currently, to wait for handler becomes idle, specific message
is used and the test would wait for condition variable to be
open when the message is processed.

However, this is already done in the HandlerUtils. Thus,
there is no need to post such message manually in the handler.

Test: atest FrameworksNetTests
Bug: 150664039

Change-Id: Iab32b2dbab01634ca159dcb90fc9f929d1fed1a2
=====
Remove setHandler in NetworkStatsService

Currently, internal handler is set by setHandler after
constructing NSS object. This was introduced in ag/866187 to
access the handler in the unit test.

However, the design put NSS in a bad situation where all classes
that need handler or executor could not be final and need to be
dynamically allocated in order to get a valid handler.

Thus, since the usage of handler is removed in previous patch,
this change eliminate setHandler by initializing the handler in
the constructor.

Test: atest FrameworksNetTests
Bug: 150664039

Change-Id: I794a24d00b0ca9fdc78091e7b9ab7307e0f034b7
=====

Bug: 150664039
Change-Id: If256ed4437ddcbcc72a6f766cff2f4cc512ee3f7
Merged-In: If256ed4437ddcbcc72a6f766cff2f4cc512ee3f7
(cherry picked from commit 2a6439d7e2a3926e10a0b9a4dc730b1a022d8138)
This commit is contained in:
Automerger Merge Worker
2020-03-04 13:36:11 +00:00
committed by Lorenzo Colitti
parent 662cc3d540
commit c0565de11f

View File

@@ -306,9 +306,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
/** Data layer operation counters for splicing into other structures. */ /** Data layer operation counters for splicing into other structures. */
private NetworkStats mUidOperations = new NetworkStats(0L, 10); private NetworkStats mUidOperations = new NetworkStats(0L, 10);
/** Must be set in factory by calling #setHandler. */ @NonNull
private Handler mHandler; private final Handler mHandler;
private Handler.Callback mHandlerCallback;
private volatile boolean mSystemReady; private volatile boolean mSystemReady;
private long mPersistThreshold = 2 * MB_IN_BYTES; private long mPersistThreshold = 2 * MB_IN_BYTES;
@@ -324,6 +323,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private final static int DUMP_STATS_SESSION_COUNT = 20; private final static int DUMP_STATS_SESSION_COUNT = 20;
@NonNull
private final Dependencies mDeps;
private static @NonNull File getDefaultSystemDir() { private static @NonNull File getDefaultSystemDir() {
return new File(Environment.getDataDirectory(), "system"); return new File(Environment.getDataDirectory(), "system");
} }
@@ -339,9 +341,24 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
Clock.systemUTC()); Clock.systemUTC());
} }
private static final class NetworkStatsHandler extends Handler { private final class NetworkStatsHandler extends Handler {
NetworkStatsHandler(Looper looper, Handler.Callback callback) { NetworkStatsHandler(@NonNull Looper looper) {
super(looper, callback); super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_PERFORM_POLL: {
performPoll(FLAG_PERSIST_ALL);
break;
}
case MSG_PERFORM_POLL_REGISTER_ALERT: {
performPoll(FLAG_PERSIST_NETWORK);
registerGlobalAlert();
break;
}
}
} }
} }
@@ -355,14 +372,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager, NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
wakeLock, getDefaultClock(), context.getSystemService(TelephonyManager.class), wakeLock, getDefaultClock(), context.getSystemService(TelephonyManager.class),
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(), new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(),
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir()); new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
new Dependencies());
service.registerLocalService(); service.registerLocalService();
HandlerThread handlerThread = new HandlerThread(TAG);
Handler.Callback callback = new HandlerCallback(service);
handlerThread.start();
Handler handler = new NetworkStatsHandler(handlerThread.getLooper(), callback);
service.setHandler(handler, callback);
return service; return service;
} }
@@ -373,7 +386,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock, AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
TelephonyManager teleManager, NetworkStatsSettings settings, TelephonyManager teleManager, NetworkStatsSettings settings,
NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir, NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
File baseDir) { File baseDir, @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");
@@ -387,6 +400,26 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mSystemDir = Objects.requireNonNull(systemDir, "missing systemDir"); mSystemDir = Objects.requireNonNull(systemDir, "missing systemDir");
mBaseDir = Objects.requireNonNull(baseDir, "missing baseDir"); mBaseDir = Objects.requireNonNull(baseDir, "missing baseDir");
mUseBpfTrafficStats = new File("/sys/fs/bpf/map_netd_app_uid_stats_map").exists(); mUseBpfTrafficStats = new File("/sys/fs/bpf/map_netd_app_uid_stats_map").exists();
mDeps = Objects.requireNonNull(deps, "missing Dependencies");
final HandlerThread handlerThread = mDeps.makeHandlerThread();
handlerThread.start();
mHandler = new NetworkStatsHandler(handlerThread.getLooper());
}
/**
* Dependencies of NetworkStatsService, for injection in tests.
*/
// TODO: Move more stuff into dependencies object.
@VisibleForTesting
public static class Dependencies {
/**
* Create a HandlerThread to use in NetworkStatsService.
*/
@NonNull
public HandlerThread makeHandlerThread() {
return new HandlerThread(TAG);
}
} }
private void registerLocalService() { private void registerLocalService() {
@@ -394,12 +427,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
new NetworkStatsManagerInternalImpl()); new NetworkStatsManagerInternalImpl());
} }
@VisibleForTesting
void setHandler(Handler handler, Handler.Callback callback) {
mHandler = handler;
mHandlerCallback = callback;
}
public void systemReady() { public void systemReady() {
synchronized (mStatsLock) { synchronized (mStatsLock) {
mSystemReady = true; mSystemReady = true;
@@ -1920,33 +1947,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
} }
@VisibleForTesting
static class HandlerCallback implements Handler.Callback {
private final NetworkStatsService mService;
HandlerCallback(NetworkStatsService service) {
this.mService = service;
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_PERFORM_POLL: {
mService.performPoll(FLAG_PERSIST_ALL);
return true;
}
case MSG_PERFORM_POLL_REGISTER_ALERT: {
mService.performPoll(FLAG_PERSIST_NETWORK);
mService.registerGlobalAlert();
return true;
}
default: {
return false;
}
}
}
}
private void assertSystemReady() { private void assertSystemReady() {
if (!mSystemReady) { if (!mSystemReady) {
throw new IllegalStateException("System not ready"); throw new IllegalStateException("System not ready");