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