17a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos/*
27a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * Copyright (C) 2014 The Android Open Source Project
37a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos *
47a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * Licensed under the Apache License, Version 2.0 (the "License");
57a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * you may not use this file except in compliance with the License.
67a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * You may obtain a copy of the License at
77a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos *
87a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos *      http://www.apache.org/licenses/LICENSE-2.0
97a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos *
107a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * Unless required by applicable law or agreed to in writing, software
117a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * distributed under the License is distributed on an "AS IS" BASIS,
127a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * See the License for the specific language governing permissions and
147a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * limitations under the License
157a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos */
167a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
177a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roospackage com.android.server.trust;
187a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
197a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.content.ComponentName;
207a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.os.SystemClock;
217a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.os.UserHandle;
2294e15a59b757678949cccb5d783bee1638e84697Adrian Roosimport android.service.trust.TrustAgentService;
237a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.util.TimeUtils;
247a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
257a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport java.io.PrintWriter;
267a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport java.util.ArrayDeque;
277a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport java.util.Iterator;
287a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
297a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos/**
307a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * An archive of trust events.
317a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos */
327a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roospublic class TrustArchive {
337a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final int TYPE_GRANT_TRUST = 0;
347a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final int TYPE_REVOKE_TRUST = 1;
357a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final int TYPE_TRUST_TIMEOUT = 2;
367a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final int TYPE_AGENT_DIED = 3;
377d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos    private static final int TYPE_AGENT_CONNECTED = 4;
387d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos    private static final int TYPE_AGENT_STOPPED = 5;
397861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    private static final int TYPE_MANAGING_TRUST = 6;
409d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos    private static final int TYPE_POLICY_CHANGED = 7;
417a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
427a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final int HISTORY_LIMIT = 200;
437a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
447a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static class Event {
457a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        final int type;
467a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        final int userId;
477a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        final ComponentName agent;
487a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        final long elapsedTimestamp;
497a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
507a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        // grantTrust
517a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        final String message;
527a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        final long duration;
5394e15a59b757678949cccb5d783bee1638e84697Adrian Roos        final int flags;
547a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
557861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        // managingTrust
567861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        final boolean managingTrust;
577861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos
587a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        private Event(int type, int userId, ComponentName agent, String message,
5994e15a59b757678949cccb5d783bee1638e84697Adrian Roos                long duration, int flags, boolean managingTrust) {
607a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            this.type = type;
617a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            this.userId = userId;
627a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            this.agent = agent;
637a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            this.elapsedTimestamp = SystemClock.elapsedRealtime();
647a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            this.message = message;
657a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            this.duration = duration;
6694e15a59b757678949cccb5d783bee1638e84697Adrian Roos            this.flags = flags;
677861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos            this.managingTrust = managingTrust;
687a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        }
697a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
707a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
717a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    ArrayDeque<Event> mEvents = new ArrayDeque<Event>();
727a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
737a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    public void logGrantTrust(int userId, ComponentName agent, String message,
7494e15a59b757678949cccb5d783bee1638e84697Adrian Roos            long duration, int flags) {
757a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        addEvent(new Event(TYPE_GRANT_TRUST, userId, agent, message, duration,
7694e15a59b757678949cccb5d783bee1638e84697Adrian Roos                flags, false));
777a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
787a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
797a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    public void logRevokeTrust(int userId, ComponentName agent) {
8094e15a59b757678949cccb5d783bee1638e84697Adrian Roos        addEvent(new Event(TYPE_REVOKE_TRUST, userId, agent, null, 0, 0, false));
817a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
827a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
837a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    public void logTrustTimeout(int userId, ComponentName agent) {
8494e15a59b757678949cccb5d783bee1638e84697Adrian Roos        addEvent(new Event(TYPE_TRUST_TIMEOUT, userId, agent, null, 0, 0, false));
857a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
867a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
877a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    public void logAgentDied(int userId, ComponentName agent) {
8894e15a59b757678949cccb5d783bee1638e84697Adrian Roos        addEvent(new Event(TYPE_AGENT_DIED, userId, agent, null, 0, 0, false));
897a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
907a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
917d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos    public void logAgentConnected(int userId, ComponentName agent) {
9294e15a59b757678949cccb5d783bee1638e84697Adrian Roos        addEvent(new Event(TYPE_AGENT_CONNECTED, userId, agent, null, 0, 0, false));
937d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos    }
947d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos
957d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos    public void logAgentStopped(int userId, ComponentName agent) {
9694e15a59b757678949cccb5d783bee1638e84697Adrian Roos        addEvent(new Event(TYPE_AGENT_STOPPED, userId, agent, null, 0, 0, false));
977861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    }
987861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos
997861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    public void logManagingTrust(int userId, ComponentName agent, boolean managing) {
10094e15a59b757678949cccb5d783bee1638e84697Adrian Roos        addEvent(new Event(TYPE_MANAGING_TRUST, userId, agent, null, 0, 0, managing));
1017d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos    }
1027d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos
1039d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos    public void logDevicePolicyChanged() {
1049d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos        addEvent(new Event(TYPE_POLICY_CHANGED, UserHandle.USER_ALL, null, null, 0, 0, false));
1059d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos    }
1069d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos
1077a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private void addEvent(Event e) {
1087a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        if (mEvents.size() >= HISTORY_LIMIT) {
1097a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            mEvents.removeFirst();
1107a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        }
1117a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        mEvents.addLast(e);
1127a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
1137a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
1147a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    public void dump(PrintWriter writer, int limit, int userId, String linePrefix,
1157a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            boolean duplicateSimpleNames) {
1167a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        int count = 0;
1177a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        Iterator<Event> iter = mEvents.descendingIterator();
1187a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        while (iter.hasNext() && count < limit) {
1197a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            Event ev = iter.next();
1209d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos            if (userId != UserHandle.USER_ALL && userId != ev.userId
1219d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                    && ev.userId != UserHandle.USER_ALL) {
1227a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                continue;
1237a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            }
1247a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
1257a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            writer.print(linePrefix);
1267a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            writer.printf("#%-2d %s %s: ", count, formatElapsed(ev.elapsedTimestamp),
1277a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    dumpType(ev.type));
1287a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            if (userId == UserHandle.USER_ALL) {
1297a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                writer.print("user="); writer.print(ev.userId); writer.print(", ");
1307a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            }
1319d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos            if (ev.agent != null) {
1329d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                writer.print("agent=");
1339d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                if (duplicateSimpleNames) {
1349d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                    writer.print(ev.agent.flattenToShortString());
1359d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                } else {
1369d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                    writer.print(getSimpleName(ev.agent));
1379d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                }
1387a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            }
1397a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            switch (ev.type) {
1407a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                case TYPE_GRANT_TRUST:
14194e15a59b757678949cccb5d783bee1638e84697Adrian Roos                    writer.printf(", message=\"%s\", duration=%s, flags=%s",
14294e15a59b757678949cccb5d783bee1638e84697Adrian Roos                            ev.message, formatDuration(ev.duration), dumpGrantFlags(ev.flags));
1437a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    break;
1447861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                case TYPE_MANAGING_TRUST:
1457861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    writer.printf(", managingTrust=" + ev.managingTrust);
1467861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    break;
1477a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                default:
1487a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            }
1497a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            writer.println();
1507a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            count++;
1517a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        }
1527a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
1537a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
154c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    public static String formatDuration(long duration) {
1557a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        StringBuilder sb = new StringBuilder();
1567a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        TimeUtils.formatDuration(duration, sb);
1577a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        return sb.toString();
1587a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
1597a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
1607a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static String formatElapsed(long elapsed) {
1617a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        long delta = elapsed - SystemClock.elapsedRealtime();
1627a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        long wallTime = delta + System.currentTimeMillis();
1637a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        return TimeUtils.logTimeOfDay(wallTime);
1647a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
1657a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
1667a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    /* package */ static String getSimpleName(ComponentName cn) {
1677a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        String name = cn.getClassName();
1687a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        int idx = name.lastIndexOf('.');
1697a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        if (idx < name.length() && idx >= 0) {
1707a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            return name.substring(idx + 1);
1717a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        } else {
1727a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            return name;
1737a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        }
1747a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
1757a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
1767a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private String dumpType(int type) {
1777a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        switch (type) {
1787a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            case TYPE_GRANT_TRUST:
1797a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                return "GrantTrust";
1807a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            case TYPE_REVOKE_TRUST:
1817a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                return "RevokeTrust";
1827a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            case TYPE_TRUST_TIMEOUT:
1837a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                return "TrustTimeout";
1847a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            case TYPE_AGENT_DIED:
1857a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                return "AgentDied";
1867d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos            case TYPE_AGENT_CONNECTED:
1877d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                return "AgentConnected";
1887d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos            case TYPE_AGENT_STOPPED:
1897d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                return "AgentStopped";
1907861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos            case TYPE_MANAGING_TRUST:
1917861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                return "ManagingTrust";
1929d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos            case TYPE_POLICY_CHANGED:
1939d6fc9246ba0b726872a6a8dabe6c334292c3a10Adrian Roos                return "DevicePolicyChanged";
1947a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            default:
1957a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                return "Unknown(" + type + ")";
1967a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        }
1977a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
19894e15a59b757678949cccb5d783bee1638e84697Adrian Roos
19994e15a59b757678949cccb5d783bee1638e84697Adrian Roos    private String dumpGrantFlags(int flags) {
20094e15a59b757678949cccb5d783bee1638e84697Adrian Roos        StringBuilder sb = new StringBuilder();
20194e15a59b757678949cccb5d783bee1638e84697Adrian Roos        if ((flags & TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER) != 0) {
20294e15a59b757678949cccb5d783bee1638e84697Adrian Roos            if (sb.length() != 0) sb.append('|');
20394e15a59b757678949cccb5d783bee1638e84697Adrian Roos            sb.append("INITIATED_BY_USER");
20494e15a59b757678949cccb5d783bee1638e84697Adrian Roos        }
20594e15a59b757678949cccb5d783bee1638e84697Adrian Roos        if ((flags & TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD) != 0) {
20694e15a59b757678949cccb5d783bee1638e84697Adrian Roos            if (sb.length() != 0) sb.append('|');
20794e15a59b757678949cccb5d783bee1638e84697Adrian Roos            sb.append("DISMISS_KEYGUARD");
20894e15a59b757678949cccb5d783bee1638e84697Adrian Roos        }
20994e15a59b757678949cccb5d783bee1638e84697Adrian Roos        if (sb.length() == 0) {
21094e15a59b757678949cccb5d783bee1638e84697Adrian Roos            sb.append('0');
21194e15a59b757678949cccb5d783bee1638e84697Adrian Roos        }
21294e15a59b757678949cccb5d783bee1638e84697Adrian Roos        return sb.toString();
21394e15a59b757678949cccb5d783bee1638e84697Adrian Roos    }
2147a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos}
215