16ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank/* 26ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Copyright (C) 2009 The Android Open Source Project 36ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * 46ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 56ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * you may not use this file except in compliance with the License. 66ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * You may obtain a copy of the License at 76ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * 86ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * http://www.apache.org/licenses/LICENSE-2.0 96ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * 106ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Unless required by applicable law or agreed to in writing, software 116ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * distributed under the License is distributed on an "AS IS" BASIS, 126ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * See the License for the specific language governing permissions and 146ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * limitations under the License. 156ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank */ 166ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank 1777424af660458104b732bdcb718874b17d0cab3aMarc Blankpackage com.android.exchange.utility; 1877424af660458104b732bdcb718874b17d0cab3aMarc Blank 19b7456eb509b95016d55b676aaf56340cc87530b3Marc Blankimport android.os.Environment; 2077424af660458104b732bdcb718874b17d0cab3aMarc Blank 2177424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.FileWriter; 2277424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.IOException; 231403386ebffa1b6093a506a6a24db4523acdc315Marc Blankimport java.io.PrintWriter; 24c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blankimport java.util.Date; 2577424af660458104b732bdcb718874b17d0cab3aMarc Blank 2677424af660458104b732bdcb718874b17d0cab3aMarc Blankpublic class FileLogger { 2777424af660458104b732bdcb718874b17d0cab3aMarc Blank private static FileLogger LOGGER = null; 28f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank private static FileWriter sLogWriter = null; 29b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank public static String LOG_FILE_NAME = 30b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank Environment.getExternalStorageDirectory() + "/emaillog.txt"; 3177424af660458104b732bdcb718874b17d0cab3aMarc Blank 3256d35257ef1493e849522c3c2828d904e4c5531fScott Kennedy public synchronized static FileLogger getLogger() { 3377424af660458104b732bdcb718874b17d0cab3aMarc Blank LOGGER = new FileLogger(); 3477424af660458104b732bdcb718874b17d0cab3aMarc Blank return LOGGER; 3577424af660458104b732bdcb718874b17d0cab3aMarc Blank } 3677424af660458104b732bdcb718874b17d0cab3aMarc Blank 376ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank private FileLogger() { 381403386ebffa1b6093a506a6a24db4523acdc315Marc Blank try { 39f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter = new FileWriter(LOG_FILE_NAME, true); 401403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } catch (IOException e) { 411403386ebffa1b6093a506a6a24db4523acdc315Marc Blank // Doesn't matter 4277424af660458104b732bdcb718874b17d0cab3aMarc Blank } 4377424af660458104b732bdcb718874b17d0cab3aMarc Blank } 4477424af660458104b732bdcb718874b17d0cab3aMarc Blank 4577424af660458104b732bdcb718874b17d0cab3aMarc Blank static public synchronized void close() { 46f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 4777424af660458104b732bdcb718874b17d0cab3aMarc Blank try { 48f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter.close(); 4977424af660458104b732bdcb718874b17d0cab3aMarc Blank } catch (IOException e) { 5077424af660458104b732bdcb718874b17d0cab3aMarc Blank // Doesn't matter 5177424af660458104b732bdcb718874b17d0cab3aMarc Blank } 52f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter = null; 5377424af660458104b732bdcb718874b17d0cab3aMarc Blank } 5477424af660458104b732bdcb718874b17d0cab3aMarc Blank } 5577424af660458104b732bdcb718874b17d0cab3aMarc Blank 561403386ebffa1b6093a506a6a24db4523acdc315Marc Blank static public synchronized void log(Exception e) { 57f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 581403386ebffa1b6093a506a6a24db4523acdc315Marc Blank log("Exception", "Stack trace follows..."); 59f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank PrintWriter pw = new PrintWriter(sLogWriter); 601403386ebffa1b6093a506a6a24db4523acdc315Marc Blank e.printStackTrace(pw); 611403386ebffa1b6093a506a6a24db4523acdc315Marc Blank pw.flush(); 621403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } 631403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } 641403386ebffa1b6093a506a6a24db4523acdc315Marc Blank 65c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank @SuppressWarnings("deprecation") 666ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank static public synchronized void log(String prefix, String str) { 6777424af660458104b732bdcb718874b17d0cab3aMarc Blank if (LOGGER == null) { 6877424af660458104b732bdcb718874b17d0cab3aMarc Blank LOGGER = new FileLogger(); 6977424af660458104b732bdcb718874b17d0cab3aMarc Blank log("Logger", "\r\n\r\n --- New Log ---"); 7077424af660458104b732bdcb718874b17d0cab3aMarc Blank } 71c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank Date d = new Date(); 72c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank int hr = d.getHours(); 73c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank int min = d.getMinutes(); 74c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank int sec = d.getSeconds(); 7577424af660458104b732bdcb718874b17d0cab3aMarc Blank 766ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank // I don't use DateFormat here because (in my experience), it's much slower 7777424af660458104b732bdcb718874b17d0cab3aMarc Blank StringBuffer sb = new StringBuffer(256); 7877424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append('['); 7977424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(hr); 8077424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(':'); 8177424af660458104b732bdcb718874b17d0cab3aMarc Blank if (min < 10) 8277424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append('0'); 8377424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(min); 8477424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(':'); 8577424af660458104b732bdcb718874b17d0cab3aMarc Blank if (sec < 10) { 8677424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append('0'); 8777424af660458104b732bdcb718874b17d0cab3aMarc Blank } 8877424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(sec); 8977424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append("] "); 9077424af660458104b732bdcb718874b17d0cab3aMarc Blank if (prefix != null) { 9177424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(prefix); 9277424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append("| "); 9377424af660458104b732bdcb718874b17d0cab3aMarc Blank } 9477424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(str); 9577424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append("\r\n"); 9677424af660458104b732bdcb718874b17d0cab3aMarc Blank String s = sb.toString(); 9777424af660458104b732bdcb718874b17d0cab3aMarc Blank 98f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 991403386ebffa1b6093a506a6a24db4523acdc315Marc Blank try { 100f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter.write(s); 101f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter.flush(); 1021403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } catch (IOException e) { 103f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank // Something might have happened to the sdcard 104f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 105f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank // If the card is mounted and we can create the writer, retry 106f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank LOGGER = new FileLogger(); 107f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 10810ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank try { 10910ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank log("FileLogger", "Exception writing log; recreating..."); 11010ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank log(prefix, str); 11110ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank } catch (Exception e1) { 11210ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank // Nothing to do at this point 11310ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank } 114f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank } 115f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank } 11677424af660458104b732bdcb718874b17d0cab3aMarc Blank } 11777424af660458104b732bdcb718874b17d0cab3aMarc Blank } 11877424af660458104b732bdcb718874b17d0cab3aMarc Blank } 11977424af660458104b732bdcb718874b17d0cab3aMarc Blank} 120