DO NOT MERGE Change batch finalization timeout mechanism from Handler#sendMessageDelayed() to a wakeful alarm

am: 1710e5f079

Change-Id: I6ffab66a6464f7fbb337d6bcb1431a0a960e25e3
This commit is contained in:
Michal Karpinski
2017-01-26 14:58:36 +00:00
committed by android-build-merger
2 changed files with 33 additions and 8 deletions

View File

@@ -1466,6 +1466,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
return (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE); return (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE);
} }
AlarmManager getAlarmManager() {
return (AlarmManager) mContext.getSystemService(AlarmManager.class);
}
IWindowManager getIWindowManager() { IWindowManager getIWindowManager() {
return IWindowManager.Stub return IWindowManager.Stub
.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); .asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
@@ -1985,7 +1989,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
long token = mInjector.binderClearCallingIdentity(); long token = mInjector.binderClearCallingIdentity();
try { try {
int affectedUserHandle = parent ? getProfileParentId(userHandle) : userHandle; int affectedUserHandle = parent ? getProfileParentId(userHandle) : userHandle;
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); AlarmManager am = mInjector.getAlarmManager();
PendingIntent pi = PendingIntent.getBroadcastAsUser(context, REQUEST_EXPIRE_PASSWORD, PendingIntent pi = PendingIntent.getBroadcastAsUser(context, REQUEST_EXPIRE_PASSWORD,
new Intent(ACTION_EXPIRED_PASSWORD_NOTIFICATION), new Intent(ACTION_EXPIRED_PASSWORD_NOTIFICATION),
PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT,

View File

@@ -16,12 +16,15 @@
package com.android.server.devicepolicy; package com.android.server.devicepolicy;
import android.app.AlarmManager;
import android.app.AlarmManager.OnAlarmListener;
import android.app.admin.DeviceAdminReceiver; import android.app.admin.DeviceAdminReceiver;
import android.app.admin.NetworkEvent; import android.app.admin.NetworkEvent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.SystemClock;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
@@ -42,11 +45,26 @@ final class NetworkLoggingHandler extends Handler {
// If this value changes, update DevicePolicyManager#retrieveNetworkLogs() javadoc // If this value changes, update DevicePolicyManager#retrieveNetworkLogs() javadoc
private static final int MAX_EVENTS_PER_BATCH = 1200; private static final int MAX_EVENTS_PER_BATCH = 1200;
private static final long BATCH_FINALIZATION_TIMEOUT_MS = TimeUnit.MINUTES.toMillis(90); private static final long BATCH_FINALIZATION_TIMEOUT_MS = TimeUnit.MINUTES.toMillis(90);
private static final long BATCH_FINALIZATION_TIMEOUT_ALARM_INTERVAL_MS =
TimeUnit.MINUTES.toMillis(30);
static final int LOG_NETWORK_EVENT_MSG = 1; private static final String NETWORK_LOGGING_TIMEOUT_ALARM_TAG = "NetworkLogging.batchTimeout";
static final int FINALIZE_BATCH_MSG = 2;
private final DevicePolicyManagerService mDpm; private final DevicePolicyManagerService mDpm;
private final AlarmManager mAlarmManager;
private final OnAlarmListener mBatchTimeoutAlarmListener = new OnAlarmListener() {
@Override
public void onAlarm() {
Log.d(TAG, "Received a batch finalization timeout alarm, finalizing "
+ mNetworkEvents.size() + " pending events.");
synchronized (NetworkLoggingHandler.this) {
finalizeBatchAndNotifyDeviceOwnerIfNotEmpty();
}
}
};
static final int LOG_NETWORK_EVENT_MSG = 1;
// threadsafe as it's Handler's thread confined // threadsafe as it's Handler's thread confined
@GuardedBy("this") @GuardedBy("this")
@@ -62,6 +80,7 @@ final class NetworkLoggingHandler extends Handler {
NetworkLoggingHandler(Looper looper, DevicePolicyManagerService dpm) { NetworkLoggingHandler(Looper looper, DevicePolicyManagerService dpm) {
super(looper); super(looper);
mDpm = dpm; mDpm = dpm;
mAlarmManager = mDpm.mInjector.getAlarmManager();
} }
@Override @Override
@@ -77,17 +96,19 @@ final class NetworkLoggingHandler extends Handler {
} }
break; break;
} }
case FINALIZE_BATCH_MSG: { default: {
finalizeBatchAndNotifyDeviceOwnerIfNotEmpty(); Log.d(TAG, "NetworkLoggingHandler received an unknown of message.");
break; break;
} }
} }
} }
void scheduleBatchFinalization() { void scheduleBatchFinalization() {
removeMessages(FINALIZE_BATCH_MSG); final long when = SystemClock.elapsedRealtime() + BATCH_FINALIZATION_TIMEOUT_MS;
sendMessageDelayed(obtainMessage(FINALIZE_BATCH_MSG), BATCH_FINALIZATION_TIMEOUT_MS); mAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, when,
Log.d(TAG, "Scheduled new batch finalization " + BATCH_FINALIZATION_TIMEOUT_MS BATCH_FINALIZATION_TIMEOUT_ALARM_INTERVAL_MS, NETWORK_LOGGING_TIMEOUT_ALARM_TAG,
mBatchTimeoutAlarmListener, this);
Log.d(TAG, "Scheduled a new batch finalization alarm " + BATCH_FINALIZATION_TIMEOUT_MS
+ "ms from now."); + "ms from now.");
} }