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