FsUtils.java revision 8b85dceadf281705a94d7546556fa5969364a658
16bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu/* 26bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * Copyright (C) 2009 The Android Open Source Project 36bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * 46bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 56bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * you may not use this file except in compliance with the License. 66bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * You may obtain a copy of the License at 76bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * 86bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * http://www.apache.org/licenses/LICENSE-2.0 96bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * 106bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * Unless required by applicable law or agreed to in writing, software 116bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 126bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * See the License for the specific language governing permissions and 146bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * limitations under the License. 156bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu */ 166bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu 17f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhupackage com.android.dumprendertree; 18f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 196bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhuimport com.android.dumprendertree.forwarder.ForwardService; 206bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu 218b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauerimport android.os.Environment; 22f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport android.util.Log; 23f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 24f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.BufferedOutputStream; 25f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.BufferedReader; 26f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.File; 27f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.FileOutputStream; 28f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.FileReader; 295dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhuimport java.io.FileWriter; 30f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.IOException; 31ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhuimport java.util.regex.Pattern; 32f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 33f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhupublic class FsUtils { 34f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 35f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu private static final String LOGTAG = "FsUtils"; 368b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString(); 378b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String HTTP_TESTS_PREFIX = 388b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer EXTERNAL_DIR + "/android/layout_tests/http/tests/"; 398b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String HTTPS_TESTS_PREFIX = 408b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer EXTERNAL_DIR + "/android/layout_tests/http/tests/ssl/"; 418b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String HTTP_LOCAL_TESTS_PREFIX = 428b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer EXTERNAL_DIR + "/android/layout_tests/http/tests/local/"; 438b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String HTTP_MEDIA_TESTS_PREFIX = 448b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer EXTERNAL_DIR + "/android/layout_tests/http/tests/media/"; 458b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String HTTP_WML_TESTS_PREFIX = 468b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer EXTERNAL_DIR + "/android/layout_tests/http/tests/wml/"; 476bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu 48f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu private FsUtils() { 49f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu //no creation of instances 50f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 51f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 52f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu public static void findLayoutTestsRecursively(BufferedOutputStream bos, 53cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block String dir, boolean ignoreResultsInDir) throws IOException { 54f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu Log.v(LOGTAG, "Searching tests under " + dir); 55f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 56f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu File d = new File(dir); 57f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu if (!d.isDirectory()) { 58f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu throw new AssertionError("A directory expected, but got " + dir); 59f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 60cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block ignoreResultsInDir |= FileFilter.ignoreResult(dir); 61f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 62f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu String[] files = d.list(); 63f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu for (int i = 0; i < files.length; i++) { 64f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu String s = dir + "/" + files[i]; 65cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block 66cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block File f = new File(s); 67cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block if (f.isDirectory()) { 68cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block // If this is not a test directory, we don't recurse into it. 69cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block if (!FileFilter.isNonTestDir(s)) { 70cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block Log.v(LOGTAG, "Recursing on " + s); 71cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block findLayoutTestsRecursively(bos, s, ignoreResultsInDir); 72cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 735e8f52f5c5ac97cbc514e72c4fc84b6fa46ebc57Steve Block continue; 745e8f52f5c5ac97cbc514e72c4fc84b6fa46ebc57Steve Block } 75cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block 76cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block // If this test should be ignored, we skip it completely. 77f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu if (FileFilter.ignoreTest(s)) { 78cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block Log.v(LOGTAG, "Ignoring: " + s); 79f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu continue; 80f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 81cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block 82cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block if ((s.toLowerCase().endsWith(".html") || s.toLowerCase().endsWith(".xml")) 83cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block && !s.endsWith("TEMPLATE.html")) { 84cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block Log.v(LOGTAG, "Recording " + s); 85f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu bos.write(s.getBytes()); 86cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block // If the result of this test should be ignored, we still run the test. 87cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block if (ignoreResultsInDir || FileFilter.ignoreResult(s)) { 88cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block bos.write((" IGNORE_RESULT").getBytes()); 89cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 90f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu bos.write('\n'); 91f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 92f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 93f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 94f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 95f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu public static void updateTestStatus(String statusFile, String s) { 96f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu try { 97f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu BufferedOutputStream bos = new BufferedOutputStream( 98f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu new FileOutputStream(statusFile)); 99f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu bos.write(s.getBytes()); 100f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu bos.close(); 101f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } catch (Exception e) { 102f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu Log.e(LOGTAG, "Cannot update file " + statusFile); 103f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 104f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 105f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 106f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu public static String readTestStatus(String statusFile) { 107f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu // read out the test name it stopped last time. 108f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu String status = null; 109f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu File testStatusFile = new File(statusFile); 110f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu if(testStatusFile.exists()) { 111f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu try { 112f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu BufferedReader inReader = new BufferedReader( 113f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu new FileReader(testStatusFile)); 114f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu status = inReader.readLine(); 115f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu inReader.close(); 116f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } catch (IOException e) { 117f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu Log.e(LOGTAG, "Error reading test status.", e); 118f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 119f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 120f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu return status; 121f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu } 122f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 1236bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu public static String getTestUrl(String path) { 1246bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu String url = null; 1256bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu if (!path.startsWith(HTTP_TESTS_PREFIX)) { 1266bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu url = "file://" + path; 1276bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu } else { 1286bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu ForwardService.getForwardService().startForwardService(); 1296bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu if (path.startsWith(HTTPS_TESTS_PREFIX)) { 1306bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu // still cut the URL after "http/tests/" 1316bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu url = "https://127.0.0.1:8443/" + path.substring(HTTP_TESTS_PREFIX.length()); 1326bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu } else if (!path.startsWith(HTTP_LOCAL_TESTS_PREFIX) 1336bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu && !path.startsWith(HTTP_MEDIA_TESTS_PREFIX) 1346bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu && !path.startsWith(HTTP_WML_TESTS_PREFIX)) { 1356bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu url = "http://127.0.0.1:8000/" + path.substring(HTTP_TESTS_PREFIX.length()); 1366bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu } else { 1376bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu url = "file://" + path; 1386bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu } 1396bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu } 1406bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu return url; 1416bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu } 1426bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu 143ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu public static boolean diffIgnoreSpaces(String file1, String file2) throws IOException { 144ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu BufferedReader br1 = new BufferedReader(new FileReader(file1)); 145ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu BufferedReader br2 = new BufferedReader(new FileReader(file2)); 146ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu boolean same = true; 147ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu Pattern trailingSpace = Pattern.compile("\\s+$"); 148ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu 149ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu while(true) { 150ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu String line1 = br1.readLine(); 151ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu String line2 = br2.readLine(); 152ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu 153ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu if (line1 == null && line2 == null) 154ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu break; 155ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu if (line1 != null) { 156ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu line1 = trailingSpace.matcher(line1).replaceAll(""); 157ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } else { 158ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu line1 = ""; 159ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } 160ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu if (line2 != null) { 161ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu line2 = trailingSpace.matcher(line2).replaceAll(""); 162ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } else { 163ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu line2 = ""; 164ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } 165ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu if(!line1.equals(line2)) { 166ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu same = false; 167ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu break; 168ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } 169ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } 170ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu 171ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu br1.close(); 172ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu br2.close(); 173ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu 174ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu return same; 175ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu } 176ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu 1775dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu public static boolean isTestPageUrl(String url) { 1785dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu int qmPostion = url.indexOf('?'); 1795dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu int slashPostion = url.lastIndexOf('/'); 1805dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu if (slashPostion < qmPostion) { 1815dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu String fileName = url.substring(slashPostion + 1, qmPostion); 1825dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu if ("index.html".equals(fileName)) { 1835dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu return true; 1845dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 1855dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 1865dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu return false; 1875dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 1885dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu 1895dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu public static String getLastSegmentInPath(String path) { 1905dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu int endPos = path.lastIndexOf('/'); 1915dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu path = path.substring(0, endPos); 1925dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu endPos = path.lastIndexOf('/'); 1935dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu return path.substring(endPos + 1); 1945dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 1955dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu 1965dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu public static void writeDrawTime(String fileName, String url, long[] times) { 1975dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu StringBuffer lineBuffer = new StringBuffer(); 1985dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu // grab the last segment of path in url 1995dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu lineBuffer.append(getLastSegmentInPath(url)); 2005dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu for (long time : times) { 2015dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu lineBuffer.append('\t'); 2025dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu lineBuffer.append(time); 2035dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 2045dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu lineBuffer.append('\n'); 2055dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu String line = lineBuffer.toString(); 2065dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu Log.v(LOGTAG, "logging draw times: " + line); 2075dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu try { 2085dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu FileWriter fw = new FileWriter(fileName, true); 2095dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu fw.write(line); 2105dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu fw.close(); 2115dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } catch (IOException ioe) { 2125dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu Log.e(LOGTAG, "Failed to log draw times", ioe); 2135dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 2145dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu } 2155dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu 216f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu} 217