1 /* 2 * Copyright (C) 2017 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 package com.android.server.net; 17 18 import static android.net.INetd.FIREWALL_CHAIN_DOZABLE; 19 import static android.net.INetd.FIREWALL_CHAIN_POWERSAVE; 20 import static android.net.INetd.FIREWALL_CHAIN_RESTRICTED; 21 import static android.net.INetd.FIREWALL_CHAIN_STANDBY; 22 import static android.net.INetd.FIREWALL_RULE_ALLOW; 23 import static android.net.INetd.FIREWALL_RULE_DENY; 24 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE; 25 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE; 26 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_RESTRICTED; 27 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY; 28 import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; 29 import static android.os.PowerExemptionManager.reasonCodeToString; 30 import static android.os.Process.INVALID_UID; 31 32 import android.app.ActivityManager; 33 import android.app.ActivityManager.ProcessCapability; 34 import android.net.NetworkPolicyManager; 35 import android.os.UserHandle; 36 import android.util.Log; 37 import android.util.Slog; 38 39 import com.android.internal.util.IndentingPrintWriter; 40 import com.android.internal.util.RingBuffer; 41 import com.android.server.am.ProcessList; 42 43 import java.text.SimpleDateFormat; 44 import java.util.Arrays; 45 import java.util.Date; 46 import java.util.Set; 47 48 public class NetworkPolicyLogger { 49 static final String TAG = "NetworkPolicy"; 50 51 static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG); 52 static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE); 53 54 private static final int MAX_LOG_SIZE = 55 ActivityManager.isLowRamDeviceStatic() ? 100 : 400; 56 private static final int MAX_NETWORK_BLOCKED_LOG_SIZE = 57 ActivityManager.isLowRamDeviceStatic() ? 100 : 400; 58 59 private static final int EVENT_TYPE_GENERIC = 0; 60 private static final int EVENT_NETWORK_BLOCKED = 1; 61 private static final int EVENT_UID_STATE_CHANGED = 2; 62 private static final int EVENT_POLICIES_CHANGED = 3; 63 private static final int EVENT_METEREDNESS_CHANGED = 4; 64 private static final int EVENT_USER_STATE_REMOVED = 5; 65 private static final int EVENT_RESTRICT_BG_CHANGED = 6; 66 private static final int EVENT_DEVICE_IDLE_MODE_ENABLED = 7; 67 private static final int EVENT_APP_IDLE_STATE_CHANGED = 8; 68 private static final int EVENT_PAROLE_STATE_CHANGED = 9; 69 private static final int EVENT_TEMP_POWER_SAVE_WL_CHANGED = 10; 70 private static final int EVENT_UID_FIREWALL_RULE_CHANGED = 11; 71 private static final int EVENT_FIREWALL_CHAIN_ENABLED = 12; 72 private static final int EVENT_UPDATE_METERED_RESTRICTED_PKGS = 13; 73 private static final int EVENT_APP_IDLE_WL_CHANGED = 14; 74 75 static final int NTWK_BLOCKED_POWER = 0; 76 static final int NTWK_ALLOWED_NON_METERED = 1; 77 static final int NTWK_BLOCKED_DENYLIST = 2; 78 static final int NTWK_ALLOWED_ALLOWLIST = 3; 79 static final int NTWK_ALLOWED_TMP_ALLOWLIST = 4; 80 static final int NTWK_BLOCKED_BG_RESTRICT = 5; 81 static final int NTWK_ALLOWED_DEFAULT = 6; 82 static final int NTWK_ALLOWED_SYSTEM = 7; 83 static final int NTWK_BLOCKED_RESTRICTED_MODE = 8; 84 85 private final LogBuffer mNetworkBlockedBuffer = new LogBuffer(MAX_NETWORK_BLOCKED_LOG_SIZE); 86 private final LogBuffer mUidStateChangeBuffer = new LogBuffer(MAX_LOG_SIZE); 87 private final LogBuffer mEventsBuffer = new LogBuffer(MAX_LOG_SIZE); 88 89 private int mDebugUid = INVALID_UID; 90 91 private final Object mLock = new Object(); 92 networkBlocked(int uid, int reason)93 void networkBlocked(int uid, int reason) { 94 synchronized (mLock) { 95 if (LOGD || uid == mDebugUid) { 96 Slog.d(TAG, uid + " is " + getBlockedReason(reason)); 97 } 98 mNetworkBlockedBuffer.networkBlocked(uid, reason); 99 } 100 } 101 uidStateChanged(int uid, int procState, long procStateSeq, @ProcessCapability int capability)102 void uidStateChanged(int uid, int procState, long procStateSeq, 103 @ProcessCapability int capability) { 104 synchronized (mLock) { 105 if (LOGV || uid == mDebugUid) { 106 Slog.v(TAG, uid + " state changed to " 107 + ProcessList.makeProcStateString(procState) + ",seq=" + procStateSeq 108 + ",cap=" + ActivityManager.getCapabilitiesSummary(capability)); 109 } 110 mUidStateChangeBuffer.uidStateChanged(uid, procState, procStateSeq, capability); 111 } 112 } 113 event(String msg)114 void event(String msg) { 115 synchronized (mLock) { 116 if (LOGV) Slog.v(TAG, msg); 117 mEventsBuffer.event(msg); 118 } 119 } 120 uidPolicyChanged(int uid, int oldPolicy, int newPolicy)121 void uidPolicyChanged(int uid, int oldPolicy, int newPolicy) { 122 synchronized (mLock) { 123 if (LOGV || uid == mDebugUid) { 124 Slog.v(TAG, 125 getPolicyChangedLog(uid, oldPolicy, newPolicy)); 126 } 127 mEventsBuffer.uidPolicyChanged(uid, oldPolicy, newPolicy); 128 } 129 } 130 meterednessChanged(int netId, boolean newMetered)131 void meterednessChanged(int netId, boolean newMetered) { 132 synchronized (mLock) { 133 if (LOGD || mDebugUid != INVALID_UID) { 134 Slog.d(TAG, 135 getMeterednessChangedLog(netId, newMetered)); 136 } 137 mEventsBuffer.meterednessChanged(netId, newMetered); 138 } 139 } 140 removingUserState(int userId)141 void removingUserState(int userId) { 142 synchronized (mLock) { 143 if (LOGD || mDebugUid != INVALID_UID) { 144 Slog.d(TAG, getUserRemovedLog(userId)); 145 } 146 mEventsBuffer.userRemoved(userId); 147 } 148 } 149 restrictBackgroundChanged(boolean oldValue, boolean newValue)150 void restrictBackgroundChanged(boolean oldValue, boolean newValue) { 151 synchronized (mLock) { 152 if (LOGD || mDebugUid != INVALID_UID) { 153 Slog.d(TAG, 154 getRestrictBackgroundChangedLog(oldValue, newValue)); 155 } 156 mEventsBuffer.restrictBackgroundChanged(oldValue, newValue); 157 } 158 } 159 deviceIdleModeEnabled(boolean enabled)160 void deviceIdleModeEnabled(boolean enabled) { 161 synchronized (mLock) { 162 if (LOGD || mDebugUid != INVALID_UID) { 163 Slog.d(TAG, getDeviceIdleModeEnabled(enabled)); 164 } 165 mEventsBuffer.deviceIdleModeEnabled(enabled); 166 } 167 } 168 appIdleStateChanged(int uid, boolean idle)169 void appIdleStateChanged(int uid, boolean idle) { 170 synchronized (mLock) { 171 if (LOGD || uid == mDebugUid) { 172 Slog.d(TAG, getAppIdleChangedLog(uid, idle)); 173 } 174 mEventsBuffer.appIdleStateChanged(uid, idle); 175 } 176 } 177 appIdleWlChanged(int uid, boolean isWhitelisted)178 void appIdleWlChanged(int uid, boolean isWhitelisted) { 179 synchronized (mLock) { 180 if (LOGD || uid == mDebugUid) { 181 Slog.d(TAG, getAppIdleWlChangedLog(uid, isWhitelisted)); 182 } 183 mEventsBuffer.appIdleWlChanged(uid, isWhitelisted); 184 } 185 } 186 paroleStateChanged(boolean paroleOn)187 void paroleStateChanged(boolean paroleOn) { 188 synchronized (mLock) { 189 if (LOGD || mDebugUid != INVALID_UID) { 190 Slog.d(TAG, getParoleStateChanged(paroleOn)); 191 } 192 mEventsBuffer.paroleStateChanged(paroleOn); 193 } 194 } 195 tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason)196 void tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason) { 197 synchronized (mLock) { 198 if (LOGV || appId == UserHandle.getAppId(mDebugUid)) { 199 Slog.v(TAG, getTempPowerSaveWlChangedLog(appId, added, reasonCode, reason)); 200 } 201 mEventsBuffer.tempPowerSaveWlChanged(appId, added, reasonCode, reason); 202 } 203 } 204 uidFirewallRuleChanged(int chain, int uid, int rule)205 void uidFirewallRuleChanged(int chain, int uid, int rule) { 206 synchronized (mLock) { 207 if (LOGV || uid == mDebugUid) { 208 Slog.v(TAG, 209 getUidFirewallRuleChangedLog(chain, uid, rule)); 210 } 211 mEventsBuffer.uidFirewallRuleChanged(chain, uid, rule); 212 } 213 } 214 firewallChainEnabled(int chain, boolean enabled)215 void firewallChainEnabled(int chain, boolean enabled) { 216 synchronized (mLock) { 217 if (LOGD || mDebugUid != INVALID_UID) { 218 Slog.d(TAG, 219 getFirewallChainEnabledLog(chain, enabled)); 220 } 221 mEventsBuffer.firewallChainEnabled(chain, enabled); 222 } 223 } 224 firewallRulesChanged(int chain, int[] uids, int[] rules)225 void firewallRulesChanged(int chain, int[] uids, int[] rules) { 226 synchronized (mLock) { 227 final String log = "Firewall rules changed for " + getFirewallChainName(chain) 228 + "; uids=" + Arrays.toString(uids) + "; rules=" + Arrays.toString(rules); 229 if (LOGD || mDebugUid != INVALID_UID) { 230 Slog.d(TAG, log); 231 } 232 mEventsBuffer.event(log); 233 } 234 } 235 meteredRestrictedPkgsChanged(Set<Integer> restrictedUids)236 void meteredRestrictedPkgsChanged(Set<Integer> restrictedUids) { 237 synchronized (mLock) { 238 final String log = "Metered restricted uids: " + restrictedUids; 239 if (LOGD || mDebugUid != INVALID_UID) { 240 Slog.d(TAG, log); 241 } 242 mEventsBuffer.event(log); 243 } 244 } 245 setDebugUid(int uid)246 void setDebugUid(int uid) { 247 mDebugUid = uid; 248 } 249 dumpLogs(IndentingPrintWriter pw)250 void dumpLogs(IndentingPrintWriter pw) { 251 synchronized (mLock) { 252 pw.println(); 253 pw.println("mEventLogs (most recent first):"); 254 pw.increaseIndent(); 255 mEventsBuffer.reverseDump(pw); 256 pw.decreaseIndent(); 257 258 pw.println(); 259 pw.println("mNetworkBlockedLogs (most recent first):"); 260 pw.increaseIndent(); 261 mNetworkBlockedBuffer.reverseDump(pw); 262 pw.decreaseIndent(); 263 264 pw.println(); 265 pw.println("mUidStateChangeLogs (most recent first):"); 266 pw.increaseIndent(); 267 mUidStateChangeBuffer.reverseDump(pw); 268 pw.decreaseIndent(); 269 } 270 } 271 getBlockedReason(int reason)272 private static String getBlockedReason(int reason) { 273 switch (reason) { 274 case NTWK_BLOCKED_POWER: 275 return "blocked by power restrictions"; 276 case NTWK_ALLOWED_NON_METERED: 277 return "allowed on unmetered network"; 278 case NTWK_BLOCKED_DENYLIST: 279 return "denylisted on metered network"; 280 case NTWK_ALLOWED_ALLOWLIST: 281 return "allowlisted on metered network"; 282 case NTWK_ALLOWED_TMP_ALLOWLIST: 283 return "temporary allowlisted on metered network"; 284 case NTWK_BLOCKED_BG_RESTRICT: 285 return "blocked when background is restricted"; 286 case NTWK_ALLOWED_DEFAULT: 287 return "allowed by default"; 288 case NTWK_BLOCKED_RESTRICTED_MODE: 289 return "blocked by restricted networking mode"; 290 default: 291 return String.valueOf(reason); 292 } 293 } 294 getPolicyChangedLog(int uid, int oldPolicy, int newPolicy)295 private static String getPolicyChangedLog(int uid, int oldPolicy, int newPolicy) { 296 return "Policy for " + uid + " changed from " 297 + NetworkPolicyManager.uidPoliciesToString(oldPolicy) + " to " 298 + NetworkPolicyManager.uidPoliciesToString(newPolicy); 299 } 300 getMeterednessChangedLog(int netId, boolean newMetered)301 private static String getMeterednessChangedLog(int netId, boolean newMetered) { 302 return "Meteredness of netId=" + netId + " changed to " + newMetered; 303 } 304 getUserRemovedLog(int userId)305 private static String getUserRemovedLog(int userId) { 306 return "Remove state for u" + userId; 307 } 308 getRestrictBackgroundChangedLog(boolean oldValue, boolean newValue)309 private static String getRestrictBackgroundChangedLog(boolean oldValue, boolean newValue) { 310 return "Changed restrictBackground: " + oldValue + "->" + newValue; 311 } 312 getDeviceIdleModeEnabled(boolean enabled)313 private static String getDeviceIdleModeEnabled(boolean enabled) { 314 return "DeviceIdleMode enabled: " + enabled; 315 } 316 getAppIdleChangedLog(int uid, boolean idle)317 private static String getAppIdleChangedLog(int uid, boolean idle) { 318 return "App idle state of uid " + uid + ": " + idle; 319 } 320 getAppIdleWlChangedLog(int uid, boolean isWhitelisted)321 private static String getAppIdleWlChangedLog(int uid, boolean isWhitelisted) { 322 return "App idle whitelist state of uid " + uid + ": " + isWhitelisted; 323 } 324 getParoleStateChanged(boolean paroleOn)325 private static String getParoleStateChanged(boolean paroleOn) { 326 return "Parole state: " + paroleOn; 327 } 328 getTempPowerSaveWlChangedLog(int appId, boolean added, int reasonCode, String reason)329 private static String getTempPowerSaveWlChangedLog(int appId, boolean added, 330 int reasonCode, String reason) { 331 return "temp-power-save whitelist for " + appId + " changed to: " + added 332 + "; reason=" + reasonCodeToString(reasonCode) + " <" + reason + ">"; 333 } 334 getUidFirewallRuleChangedLog(int chain, int uid, int rule)335 private static String getUidFirewallRuleChangedLog(int chain, int uid, int rule) { 336 return String.format("Firewall rule changed: %d-%s-%s", 337 uid, getFirewallChainName(chain), getFirewallRuleName(rule)); 338 } 339 getFirewallChainEnabledLog(int chain, boolean enabled)340 private static String getFirewallChainEnabledLog(int chain, boolean enabled) { 341 return "Firewall chain " + getFirewallChainName(chain) + " state: " + enabled; 342 } 343 getFirewallChainName(int chain)344 private static String getFirewallChainName(int chain) { 345 switch (chain) { 346 case FIREWALL_CHAIN_DOZABLE: 347 return FIREWALL_CHAIN_NAME_DOZABLE; 348 case FIREWALL_CHAIN_STANDBY: 349 return FIREWALL_CHAIN_NAME_STANDBY; 350 case FIREWALL_CHAIN_POWERSAVE: 351 return FIREWALL_CHAIN_NAME_POWERSAVE; 352 case FIREWALL_CHAIN_RESTRICTED: 353 return FIREWALL_CHAIN_NAME_RESTRICTED; 354 default: 355 return String.valueOf(chain); 356 } 357 } 358 getFirewallRuleName(int rule)359 private static String getFirewallRuleName(int rule) { 360 switch (rule) { 361 case FIREWALL_RULE_DEFAULT: 362 return "default"; 363 case FIREWALL_RULE_ALLOW: 364 return "allow"; 365 case FIREWALL_RULE_DENY: 366 return "deny"; 367 default: 368 return String.valueOf(rule); 369 } 370 } 371 372 private final static class LogBuffer extends RingBuffer<Data> { 373 private static final SimpleDateFormat sFormatter 374 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS"); 375 private static final Date sDate = new Date(); 376 LogBuffer(int capacity)377 public LogBuffer(int capacity) { 378 super(Data.class, capacity); 379 } 380 uidStateChanged(int uid, int procState, long procStateSeq, @ProcessCapability int capability)381 public void uidStateChanged(int uid, int procState, long procStateSeq, 382 @ProcessCapability int capability) { 383 final Data data = getNextSlot(); 384 if (data == null) return; 385 386 data.reset(); 387 data.type = EVENT_UID_STATE_CHANGED; 388 data.ifield1 = uid; 389 data.ifield2 = procState; 390 data.ifield3 = capability; 391 data.lfield1 = procStateSeq; 392 data.timeStamp = System.currentTimeMillis(); 393 } 394 event(String msg)395 public void event(String msg) { 396 final Data data = getNextSlot(); 397 if (data == null) return; 398 399 data.reset(); 400 data.type = EVENT_TYPE_GENERIC; 401 data.sfield1 = msg; 402 data.timeStamp = System.currentTimeMillis(); 403 } 404 networkBlocked(int uid, int reason)405 public void networkBlocked(int uid, int reason) { 406 final Data data = getNextSlot(); 407 if (data == null) return; 408 409 data.reset(); 410 data.type = EVENT_NETWORK_BLOCKED; 411 data.ifield1 = uid; 412 data.ifield2 = reason; 413 data.timeStamp = System.currentTimeMillis(); 414 } 415 uidPolicyChanged(int uid, int oldPolicy, int newPolicy)416 public void uidPolicyChanged(int uid, int oldPolicy, int newPolicy) { 417 final Data data = getNextSlot(); 418 if (data == null) return; 419 420 data.reset(); 421 data.type = EVENT_POLICIES_CHANGED; 422 data.ifield1 = uid; 423 data.ifield2 = oldPolicy; 424 data.ifield3 = newPolicy; 425 data.timeStamp = System.currentTimeMillis(); 426 } 427 meterednessChanged(int netId, boolean newMetered)428 public void meterednessChanged(int netId, boolean newMetered) { 429 final Data data = getNextSlot(); 430 if (data == null) return; 431 432 data.reset(); 433 data.type = EVENT_METEREDNESS_CHANGED; 434 data.ifield1 = netId; 435 data.bfield1 = newMetered; 436 data.timeStamp = System.currentTimeMillis(); 437 } 438 userRemoved(int userId)439 public void userRemoved(int userId) { 440 final Data data = getNextSlot(); 441 if (data == null) return; 442 443 data.reset(); 444 data.type = EVENT_USER_STATE_REMOVED; 445 data.ifield1 = userId; 446 data.timeStamp = System.currentTimeMillis(); 447 } 448 restrictBackgroundChanged(boolean oldValue, boolean newValue)449 public void restrictBackgroundChanged(boolean oldValue, boolean newValue) { 450 final Data data = getNextSlot(); 451 if (data == null) return; 452 453 data.reset(); 454 data.type = EVENT_RESTRICT_BG_CHANGED; 455 data.bfield1 = oldValue; 456 data.bfield2 = newValue; 457 data.timeStamp = System.currentTimeMillis(); 458 } 459 deviceIdleModeEnabled(boolean enabled)460 public void deviceIdleModeEnabled(boolean enabled) { 461 final Data data = getNextSlot(); 462 if (data == null) return; 463 464 data.reset(); 465 data.type = EVENT_DEVICE_IDLE_MODE_ENABLED; 466 data.bfield1 = enabled; 467 data.timeStamp = System.currentTimeMillis(); 468 } 469 appIdleStateChanged(int uid, boolean idle)470 public void appIdleStateChanged(int uid, boolean idle) { 471 final Data data = getNextSlot(); 472 if (data == null) return; 473 474 data.reset(); 475 data.type = EVENT_APP_IDLE_STATE_CHANGED; 476 data.ifield1 = uid; 477 data.bfield1 = idle; 478 data.timeStamp = System.currentTimeMillis(); 479 } 480 appIdleWlChanged(int uid, boolean isWhitelisted)481 public void appIdleWlChanged(int uid, boolean isWhitelisted) { 482 final Data data = getNextSlot(); 483 if (data == null) return; 484 485 data.reset(); 486 data.type = EVENT_APP_IDLE_WL_CHANGED; 487 data.ifield1 = uid; 488 data.bfield1 = isWhitelisted; 489 data.timeStamp = System.currentTimeMillis(); 490 } 491 paroleStateChanged(boolean paroleOn)492 public void paroleStateChanged(boolean paroleOn) { 493 final Data data = getNextSlot(); 494 if (data == null) return; 495 496 data.reset(); 497 data.type = EVENT_PAROLE_STATE_CHANGED; 498 data.bfield1 = paroleOn; 499 data.timeStamp = System.currentTimeMillis(); 500 } 501 tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason)502 public void tempPowerSaveWlChanged(int appId, boolean added, 503 int reasonCode, String reason) { 504 final Data data = getNextSlot(); 505 if (data == null) return; 506 507 data.reset(); 508 data.type = EVENT_TEMP_POWER_SAVE_WL_CHANGED; 509 data.ifield1 = appId; 510 data.ifield2 = reasonCode; 511 data.bfield1 = added; 512 data.sfield1 = reason; 513 data.timeStamp = System.currentTimeMillis(); 514 } 515 uidFirewallRuleChanged(int chain, int uid, int rule)516 public void uidFirewallRuleChanged(int chain, int uid, int rule) { 517 final Data data = getNextSlot(); 518 if (data == null) return; 519 520 data.reset(); 521 data.type = EVENT_UID_FIREWALL_RULE_CHANGED; 522 data.ifield1 = chain; 523 data.ifield2 = uid; 524 data.ifield3 = rule; 525 data.timeStamp = System.currentTimeMillis(); 526 } 527 firewallChainEnabled(int chain, boolean enabled)528 public void firewallChainEnabled(int chain, boolean enabled) { 529 final Data data = getNextSlot(); 530 if (data == null) return; 531 532 data.reset(); 533 data.type = EVENT_FIREWALL_CHAIN_ENABLED; 534 data.ifield1 = chain; 535 data.bfield1 = enabled; 536 data.timeStamp = System.currentTimeMillis(); 537 } 538 reverseDump(IndentingPrintWriter pw)539 public void reverseDump(IndentingPrintWriter pw) { 540 final Data[] allData = toArray(); 541 for (int i = allData.length - 1; i >= 0; --i) { 542 if (allData[i] == null) { 543 pw.println("NULL"); 544 continue; 545 } 546 pw.print(formatDate(allData[i].timeStamp)); 547 pw.print(" - "); 548 pw.println(getContent(allData[i])); 549 } 550 } 551 getContent(Data data)552 public String getContent(Data data) { 553 switch (data.type) { 554 case EVENT_TYPE_GENERIC: 555 return data.sfield1; 556 case EVENT_NETWORK_BLOCKED: 557 return data.ifield1 + "-" + getBlockedReason(data.ifield2); 558 case EVENT_UID_STATE_CHANGED: 559 return data.ifield1 + ":" + ProcessList.makeProcStateString(data.ifield2) 560 + ":" + ActivityManager.getCapabilitiesSummary(data.ifield3) 561 + ":" + data.lfield1; 562 case EVENT_POLICIES_CHANGED: 563 return getPolicyChangedLog(data.ifield1, data.ifield2, data.ifield3); 564 case EVENT_METEREDNESS_CHANGED: 565 return getMeterednessChangedLog(data.ifield1, data.bfield1); 566 case EVENT_USER_STATE_REMOVED: 567 return getUserRemovedLog(data.ifield1); 568 case EVENT_RESTRICT_BG_CHANGED: 569 return getRestrictBackgroundChangedLog(data.bfield1, data.bfield2); 570 case EVENT_DEVICE_IDLE_MODE_ENABLED: 571 return getDeviceIdleModeEnabled(data.bfield1); 572 case EVENT_APP_IDLE_STATE_CHANGED: 573 return getAppIdleChangedLog(data.ifield1, data.bfield1); 574 case EVENT_APP_IDLE_WL_CHANGED: 575 return getAppIdleWlChangedLog(data.ifield1, data.bfield1); 576 case EVENT_PAROLE_STATE_CHANGED: 577 return getParoleStateChanged(data.bfield1); 578 case EVENT_TEMP_POWER_SAVE_WL_CHANGED: 579 return getTempPowerSaveWlChangedLog(data.ifield1, data.bfield1, 580 data.ifield2, data.sfield1); 581 case EVENT_UID_FIREWALL_RULE_CHANGED: 582 return getUidFirewallRuleChangedLog(data.ifield1, data.ifield2, data.ifield3); 583 case EVENT_FIREWALL_CHAIN_ENABLED: 584 return getFirewallChainEnabledLog(data.ifield1, data.bfield1); 585 default: 586 return String.valueOf(data.type); 587 } 588 } 589 formatDate(long millis)590 private String formatDate(long millis) { 591 sDate.setTime(millis); 592 return sFormatter.format(sDate); 593 } 594 } 595 596 public final static class Data { 597 int type; 598 long timeStamp; 599 600 int ifield1; 601 int ifield2; 602 int ifield3; 603 long lfield1; 604 boolean bfield1; 605 boolean bfield2; 606 String sfield1; 607 reset()608 public void reset(){ 609 sfield1 = null; 610 } 611 } 612 } 613